我正在将文件中的csv数据加载到数据表中进行处理。
问题是,我想要处理多个文件,而我对数据表的测试显示了巨大的内存消耗 我测试了一个37MB的csv文件,内存增长到240MB,这是很多恕我直言。 我读过,数据表中存在开销,我可以使用大约70MB的大小,但不是240MB,这意味着它是原始大小的六倍。 我在这里读到,数据表需要比POCO更多的内存,但差别太大了。
我放了一个内存分析器看看,如果我有内存泄漏和内存在哪里。我发现,datatablecolumns有6MB到19MB之间填充字符串,数据表有大约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;
}
答案 0 :(得分:2)
DataSet
及其子DataTable
,DataRow
等构成内存中的关系数据库。涉及很多开销(虽然它确实使[某些]事情变得非常方便。
如果内存有问题,
IList<T>
来保存它们DataTable
的基本语义构建一个轻量级类:
您确定需要CSV文件的内存中表示吗?你可以通过IDataReader
像Sebastien Lorion的Fast CSV Reader访问它们吗?
答案 1 :(得分:0)
DataTables是将表格数据放入内存并添加大量与表相关的功能的通用解决方案。如果您无法接受开销,则可以选择1)编写您自己的DataTable类,消除您不需要的开销2)使用仍然可以完成您所需的替代表示,可能是基于POCO的,或者可能是XMLDocument (也许可能有更多的开销,从来没有真正担心它)。 3)停止尝试将所有内容加载到内存中,并根据需要从外部存储中提取数据。