Joh*_*o75 5 c# memory csv datatable memory-consumption
我正在将csv数据从文件加载到数据表中进行处理。
问题是,我要处理多个文件,而对数据表的测试显示了我对37MB的csv文件进行测试所消耗的大量内存,并且内存增长到了240MB,这对许多恕我直言都是如此。我读到,数据表中有开销,我可以承受大约70MB的大小,而不是240MB,这意味着它是原始大小的六倍。我在这里读到,数据表比POCO需要更多的内存,但是差异太大了。
我戴上内存分析器,看一下是否有内存泄漏以及内存在哪里。我发现,数据表列的字符串填充在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;
}
Run Code Online (Sandbox Code Playgroud)
DataSet及其子项DataTable、DataRow等组成内存关系数据库。涉及很多开销(尽管它确实使[某些]事情非常方便。
如果内存有问题,
IList<T>用来保存它们DataTable:
您确定需要在内存中表示 CSV 文件吗?您可以通过IDataReaderSebastien Lorion 的Fast CSV Reader 之类的方式访问它们吗?
| 归档时间: |
|
| 查看次数: |
10520 次 |
| 最近记录: |