파일의 csv 데이터를 처리하기 위해 데이터 테이블에로드하고 있습니다.DataTable 메모리 사용량이 많습니다.
문제는 내가이 데이터 테이블은 내게 많은 IMHO에 방법입니다 37메가바이트 CSV 파일 및 240메가바이트까지 growed 메모리, 테스트 거대한 메모리 소비 표시로 여러 파일 내 테스트를 처리하려는 것이다.데이터 테이블에 오버 헤드가 있고 크기가 약 70MB이지만 240MB가 아니라는 것을 알았습니다. 이는 원래 크기의 6 배를 의미합니다. 필자는 여기서 datatables가 POCO보다 더 많은 메모리를 필요로하지만 차이점은 너무 많다는 것을 알았습니다.
저는 메모리 누수가 있고 메모리가 어디에 있는지, 메모리 프로파일 러를 착용하고 보았습니다. datatablecolumns는 6MB에서 19MB 사이에 문자열로 채워져 있고 데이터 테이블에는 약 20 개의 열이 있다는 것을 알았습니다. 값이 열에 저장되어 있습니까? 왜 메모리를 많이 차지했는지, 메모리 소비를 줄이려면 어떻게해야합니까? 이 메모리 소비량으로 인해 datattables를 사용할 수없는 것 같습니다.
누군가 다른 사람이 datatables와 같은 문제가 있거나 잘못된 것을하고 있습니까?
추신 : 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;
}
추측을 원하십니까? 아니면 Google에서 어떤 코드를 보여 주시겠습니까? – Ehsan
코드에 다른 객체가 있어야 할 것 같습니까? –
메모리가 저렴하지만 어쩌면이 방법으로 메모리 효율적인 솔루션을 찾을 수 있습니다. http://stackoverflow.com/questions/275269/does-a-datatable-consume-more-memory-than-a-listt – dcaswell