2016-11-07 17 views
1

我目前正在研究一個讀取大型文件或者多個文件的項目,這些文件需要>數百萬行。爲此,我使用Streamreader來讀取每一行。 檢查每一行是否包含某個字符串。當條件成立時,我會添加一行。我要重現內存中的代碼,因爲我沒有在我面前代碼:如何通過在MigraDoc中添加大量行來避免高內存使用率?

Table table = new Table(); 
Row row = new Row(); 
Cell cell = new Cell(); 
using(Streamreader sr = new Streamreader(file)) 
{ 
    string str; 
    while((str = sr.ReadLine()) != null) 
    { 
     if(str.Includes("Marker")) 
     { 
      row = table.AddRow(); 
      cell = row.Cells[0] 
      cell = row.Cells[1] // actually I use a counter variable, cause my table has 6 cells consistent. 
     } 
    } 
} 

所以每次的條件爲真,行對象將被添加,並以百萬計的這些線的存在也將數以百萬計的物體,這些物體會影響我的內存,並且很可能會「爆炸」。我嘗試了幾件事,例如用行對象創建一個列表,並在一定數量後清除它們。但是我必須弄清楚它不會從內存中清除對象(list.Clear)。我試圖手動調用垃圾收集器,但它對我的性能有負面影響。而現在我處於一個我不知道如何處理這個問題的地步。有了50萬行的數量達到了將近7GB的RAM,並且我有8GB的可用空間。

我將不勝感激任何建議,我可以如何避免高內存或至少保持公羊低。

我也想補充一點,我在新的計算器如果有什麼不清楚隨時指出來或點對我道:通過閱讀你的輸入文件P

回答

2

你做正確的事從流線逐行。這意味着只有每個輸入文件的當前行需要存在於RAM中。

但是,你做錯了一件事,就是將每行放入Table對象中,以匹配標記。那些表對象居住在RAM中。嘗試使用數百萬個Row對象創建Table對象將會耗盡RAM,就像您發現的那樣。

dotnet集合類在支持大量集合方面做得很好。但是使用RAM沒有任何魔力。

您需要找出一種方法來限制Table對象中Row對象的數量。你可以跟蹤行數,當它達到一定數量(誰知道有多大?10K?100K?)將表寫入磁盤並創建一個新的?

此外,似乎Migradoc生成PDF文件。一百萬頁的pdf文件是一個有用的對象嗎?這似乎不太可能。對於RTF文件也是如此。

+0

首先感謝您的快速回答。那麼我認爲它是不可管理的。我可以跟蹤行數,我會盡力實施你的建議。你也可以用migradoc生成rtf文件。 – kuzurkurt

相關問題