Я загружаю данные csv из файлов в datatable для обработки.Огромное потребление памяти DataTable
Проблема заключается в том, что я хочу обрабатывать несколько файлов, а мои тесты с помощью datatable показывают мне огромное потребление памяти. Я тестировал файл csv размером 37 МБ, а память выросла до 240 МБ, что является способом для многих ИМХО. Я читал, что в datatable есть накладные расходы, и я мог бы жить с размером около 70 МБ, но не 240 МБ, а это значит, что он в шесть раз превышает первоначальный размер. Я читаю здесь, что для данных данных требуется больше памяти, чем POCOs, но разница слишком велика.
Я надел профайлер памяти и посмотрел, если у меня есть утечки памяти и где находится память. Я обнаружил, что у datatablecolumns между 6MB и 19MB, заполненными строками, и у datatable было около 20 столбцов. Значения хранятся в столбцах? Почему так много памяти, что я могу сделать, чтобы уменьшить потребление памяти. С этими потребляемыми в памяти расходными материалами кажется непригодным.
Были ли у кого-то еще такие проблемы с datatables, или я что-то не так?
PS: Я пробовал файл размером 70 МБ, а число данных увеличивалось до 500 МБ!
OK Вот небольшая тестовая таблица: 37-мегабайтный csv-файл (21 колонка) позволяет памяти расти до 179 МБ.
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;
}
Вы хотите, чтобы мы догадались или вы покажете нам какой-то код? – Ehsan
Я предполагаю, что в вашем коде должны быть какие-то другие объекты? –
Память дешевая, но: Возможно, это поможет найти более эффективное решение для памяти: http://stackoverflow.com/questions/275269/does-a-datatable-consume-more-memory-than-a-listt – dcaswell