我正在将CSV数据从文件加载到datatable中进行处理。
问题是,我想处理多个文件,并且我的datatable测试显示出巨大的内存消耗。我尝试了一个37MB的CSV文件,内存增长到了240MB,这明显太多了。我阅读到datatable中存在一些额外开销,并且可以接受约70MB的大小,但不应该是240MB,这意味着它比原始大小大了六倍。我在这里阅读到datatable需要比POCO更多的内存,但差距太大了。
我运行了内存分析器并查看了内存泄漏以及内存位置。我发现datatable列之间有6MB到19MB的字符串填充,datatable有约20列。这些值存储在列中吗?为什么会占用这么多内存?我该如何减少内存消耗。以这种内存消耗方式,datatables似乎无法使用。
还有其他人遇到过datatable的这些问题吗?或者是我在做错什么吗?
PS:我尝试了一个70MB的文件,datatable增长到了500MB!
以下是一个小的测试案例: 这个37MB的CSV文件(21列)使内存增加到了179MB。
问题是,我想处理多个文件,并且我的datatable测试显示出巨大的内存消耗。我尝试了一个37MB的CSV文件,内存增长到了240MB,这明显太多了。我阅读到datatable中存在一些额外开销,并且可以接受约70MB的大小,但不应该是240MB,这意味着它比原始大小大了六倍。我在这里阅读到datatable需要比POCO更多的内存,但差距太大了。
我运行了内存分析器并查看了内存泄漏以及内存位置。我发现datatable列之间有6MB到19MB的字符串填充,datatable有约20列。这些值存储在列中吗?为什么会占用这么多内存?我该如何减少内存消耗。以这种内存消耗方式,datatables似乎无法使用。
还有其他人遇到过datatable的这些问题吗?或者是我在做错什么吗?
PS:我尝试了一个70MB的文件,datatable增长到了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;
}