2013-08-26 90 views
3

我正在將文件中的csv數據加載到數據表中進行處理。數據表內存大量消耗

問題是,我想處理幾個文件,我用數據表的測試顯示我巨大的內存消耗 我測試了一個37MB的csv文件和內存增長到240MB,這是很多恕我直言。 我讀過,數據表中有開銷,我可以使用大約70MB,但不是240MB,這意味着它是原始大小的六倍。 我在這裏讀到,數據表需要比POCO更多的內存,但差別太大了。

我把一個內存分析器和看,如果我有內存泄漏,內存在哪裏。我發現,數據表列有6MB到19MB之間填充字符串,數據表大約有20列。這些值是否存儲在列中?爲什麼需要這麼多內存,我該怎麼做才能減少內存消耗。 這種內存消耗數據表似乎無法使用。

有其他人對數據表有這樣的問題,或者我做錯了什麼?

PS:我試了一個70MB的文件,數據表增長到500MB!

確定這裏是一個小型測試用例: 37MB csv-file(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

你想我們猜測或者你會展示一些代碼讓我們來看看? – Ehsan

+0

我猜你的代碼中必須有其他對象? –

+1

內存很便宜,但:也許這有助於您找到更高效的內存解決方案:http://stackoverflow.com/questions/275269/does-a-datatable-consume-more-memory-than-a-listt – dcaswell

回答

0

DataTables是將表格數據放入內存並添加大量表格相關功能的通用解決方案。如果開銷不可接受,您可以選擇1)編寫自己的DataTable類,以消除不需要的開銷2)使用替代表示法,該表示法仍然可以完成您需要的任務,可能是基於POCO的,或者可能是XMLDocument (可能會有更多的開銷,從來沒有真正擔心它)。 3)停止嘗試將所有內容加載到內存中,並根據需要從外部存儲中提取數據。

+0

1 Alread嘗試了Telerik的Silverlight數據表(http://blogs.telerik.com/vladimirenchev/posts/09-04-23/lightweight-datatable-for-your-silverlight-applications.aspx),這不是輕量級的,它消耗更多的內存。問題是如果你想要編輯功能,它不能是輕量級的。否則,使用字典列表更輕量級,這是我唯一的希望。 – JohnnyBravo75

+0

2.基於POCO是不可替代的,因爲我沒有特別的數據。每個數據都有另一種結構。 3.那是我正在評估的。問題是,我需要處理數據,構建關鍵列/索引,對它們進行排序....也許像sqlite這樣的輕量級數據庫是最好的選擇。 – JohnnyBravo75

+0

聽起來很像我的選擇3 - 有幾個數據庫選項。輕量級可能是一個不錯的選擇,或者您可能需要一些更具可擴展性的東西,但數據庫幾乎是您的信息不適合內存或需要持久存儲時應考慮使用的首要事項之一。它的功能。如果你現在做出改變,好處是當你繼續添加數據時,你不會突然「碰壁」 –

1

DataSet及其子女DataTableDataRow等構成了內存中的關係數據庫。有很多的開銷參與(雖然它確實讓[某些]東西很方便。

如果記憶是一個問題,

  • 構建域對象代表在CSV每行有類型的文件。性能
  • 創建一個自定義集合(或只使用IList<T>追究他們
  • 另外,建立一個輕量類與DataTable的基本語義:
    • 按編號選擇行的功能
    • 按行號和列名或編號選擇行內列的功能。
    • 知道有序集合列名
    • 獎金的能力:選擇通過名稱或序數列,並接收其值的列表,每行一個的能力。

你確定你需要你的CSV文件在內存中的表現?你可以通過IDataReader訪問它們,如Sebastien Lorion的Fast CSV Reader

+0

是的,但是6-7的因子不能。我的代碼中一定有問題,否則數據表是不可用的廢話。這就是爲什麼我要求其他用戶的統計/經驗值進行比較。沒有數據庫有這樣的開銷。如果我把它們放在Sqlite中,它不會那麼大。我編寫了自己的csv閱讀器AdoAdapter和XmlReader,並將應用程序設計爲與內存中的datable一起使用,並且通過第二因素的校準,它可以工作。但是這種開銷會破壞我的設計。其他用戶的體驗是什麼? – JohnnyBravo75