2013-08-26 3 views
3

파일의 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; 
    } 
+0

추측을 원하십니까? 아니면 Google에서 어떤 코드를 보여 주시겠습니까? – Ehsan

+0

코드에 다른 객체가 있어야 할 것 같습니까? –

+1

메모리가 저렴하지만 어쩌면이 방법으로 메모리 효율적인 솔루션을 찾을 수 있습니다. http://stackoverflow.com/questions/275269/does-a-datatable-consume-more-memory-than-a-listt – dcaswell

답변

0

DataTables 메모리에 tablular 데이터를 넣고 테이블 관련 기능을 많이 추가하는 일반적인 솔루션입니다. 오버 헤드가 허용되지 않는 경우 1) 필요하지 않은 오버 헤드를 제거하는 자체 DataTable 클래스를 작성합니다. 2) POCO 또는 XMLDocument와 같은 필요한 표현을 여전히 수행하는 대체 표현을 사용합니다. (더 많은 오버 헤드가 있을지도 모릅니다. 걱정할 필요가 없습니다.) 3) 모든 것을 메모리에로드하려고 시도하지 말고 필요한 경우 외부 저장소에서 데이터를 가져옵니다.

+0

1 Alread는 Telerik (http://blogs.telerik.com/vladimirenchev/posts/09-04-23/lightweight-datatable-for-your-silverlight-applications.aspx)에서 Silverlight 데이터 테이블을 사용해 보았습니다. 그것은 훨씬 더 많은 메모리를 소비합니다. 문제는 가벼워서는 안되는 편집 기능을 원할 때입니다. 그렇지 않으면 좀 더 가벼운 사전 목록을 사용하는 것이 나의 유일한 희망입니다. – JohnnyBravo75

+0

2. POCO 기반은 특별한 데이터가 없기 때문에 대안이 아닙니다. 모든 데이터에는 또 다른 구조가 있습니다. 3. 예, 그렇습니다. 문제는 데이터를 처리하고 키 열/인덱스를 작성하여 정렬해야한다는 것입니다. 아마도 sqlite와 같은 간단한 데이터베이스가 필요합니다. – JohnnyBravo75

+0

그건 내 옵션 3처럼 들리네. - 몇 가지 데이터베이스 옵션이있다. 경량이 좋은 선택 일 수도 있고 확장 성이 필요한 것이 필요할 수도 있지만, 데이터베이스는 정보가 메모리에 편리하게 맞지 않을 때나 영구 저장소가 필요할 때 사용하는 것이 가장 먼저 고려해야 할 사항 중 하나입니다. 그것들이하는 일. 지금 변경하면 더할 나위없이 데이터를 계속 추가하면 갑자기 "벽에 부딪치지"않을 것입니다. –

1

및 그의 자식 DataTable, DataRow 등은 메모리 내 관계형 데이터베이스를 구성합니다. 많은이 그것을 만들 않지만 (참여 오버 헤드 [어떤] 일 매우 편리합니다.

메모리가 문제가있는 경우

, 입력 된로 파일을 당신의 CSV의 각 행을 나타내는 객체 도메인

  • 빌드 .
      : 속성
    • DataTable의 기본 의미와 함께 경량 클래스를 구축, 사용자 정의 모음 만들기 (또는 다른 방법으로 그들에게
    • 를 개최 IList<T>를 사용
    • 숫자로 행을 선택하는 기능
    • 행 번호와 열 이름 또는 번호별로 행 내의 열을 선택할 수있는 기능.
    • 열 이름
    • 보너스의 명령 세트를 알 수있는 능력 : 이름 또는 서수에 의해 열을 선택하고 값 목록, 행마다 하나가 나타날 수있는 기능입니다.

당신은 당신이 당신의 CSV 파일의 메모리 내 표현을 필요시겠습니까? Sebastien Lorion의 Fast CSV Reader처럼 IDataReader을 통해 액세스 할 수 있습니까?

+0

예,하지만 6-7의 인수는 사용할 수 없습니다. 내 코드에 문제가 있어야합니다. 그렇지 않으면 데이터 테이블을 사용할 수 없게됩니다. 그 이유는 다른 사용자로부터 통계/경험 값을 비교하도록 요청한 이유입니다. 데이터베이스에는 그러한 오버 헤드가 없습니다. 내가 Sqlite에 넣으면 너무 커지지 않습니다. 필자는 독자적인 csv 리더 인 AdoAdapter, XmlReader를 작성하고 메모리의 datables와 함께 작동하도록 응용 프로그램을 디자인했으며 작동하는 두 번째 요인의 계산으로이 응용 프로그램을 설계했습니다. 하지만이 오버 헤드로 인해 디자인이 파괴 될 것입니다. 다른 사용자의 경험은 무엇입니까? – JohnnyBravo75

관련 문제