我正在将文件中的 csv 数据加载到数据表中进行处理。
问题是,我想处理几个文件,我对数据表的测试显示我使用 37MB csv 文件测试的巨大内存消耗,内存增长到 240MB,恕我直言。我读到,数据表中有开销,我可以忍受大约 70MB 的大小,但不是 240MB,这意味着它是原始大小的六倍。我在这里读到,数据表需要比 POCO 更多的内存,但差别太大了。
我戴上内存分析器并查看是否有内存泄漏以及内存在哪里。我发现,datatablecolumns 有 6MB 到 19MB 的空间填充了字符串,并且 datatable 有大约 20 列。值是否存储在列中?为什么要占用这么多内存,我该怎么做才能减少内存消耗。有了这种内存消耗,数据表似乎无法使用。
有其他人对数据表有这样的问题,还是我做错了什么?
PS:我尝试了一个70MB的文件,数据表增长到了500MB!
好的,这是一个小测试用例:37MB 的 csv 文件(21 列)让内存增长到 179MB。
private static DataTable ReadCsv()
{
DataTable table = new DataTable();
table.BeginLoadData();
using (var reader = new StreamReader(File.OpenRead(@"C:\Develop\Tests\csv-Data\testdaten\test.csv")))
{
int y = 0;
int columnsCount = 0;
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
if (y == 0)
{
columnsCount = values.Count();
// create columns
for (int x = 0; x < columnsCount; x++)
{
table.Columns.Add(new DataColumn(values[x], typeof(string)));
}
}
else
{
if (values.Length == columnsCount)
{
// add the data
table.Rows.Add(values);
}
}
y++;
}
table.EndLoadData();
table.AcceptChanges();
}
return table;
}