2013-07-22 77 views
1

我需要在txt文件中寫入進程的結果。這個過程非常長,要寫入的數據量很大(〜150Gb)。該程序工作正常,但問題是內存過載,並在某一點,它只是停止。寫入巨大的txt文件而不會超載RAM

程序很簡單:

ostream f; 
f.open(filePath); 
for(int k=0; k<nDataset; k++){ 
    //treat element of dataset 
    f << result; 
} 
f.close(); 

有沒有寫這個文件,而不會加重記憶的一種方式?

+2

f >> result; if(k%10000 == 0)f.flush(); – Jiminion

+0

你是什麼意思「ram變得超載」?抖動?處理使用更多的內存,機器有內存? –

+0

您的問題表明您在編寫* * *文本*文件時遇到問題,但是您的代碼顯示*閱讀*壓縮*文件。 -1對於「不清楚或沒用」的問題 –

回答

4

您應該定期刷新輸出。

例如:

if (k%10000 == 0) f.flush(); 
+0

這應該是一個評論而不是答案。 – Borgleader

+1

我不同意這些評論。這顯然不僅僅是一個答案,而且還是一個答案,如果看起來這個「igzstream」永遠不會自動刷新。 +1 – EJP

+0

@EJP:爲什麼需要刷新一個'igzstream'? (提示:*我*是*輸入*,他從中提取數據) –

2

我想建議是這樣的

ogzstream f; 
f.open(filePath); 
string s(""); 
for(int k=0; k<nDataset; k++){ 
    //treat element of dataset 

    s.append(result); 

    if (s.length() == OPTIMUM_BUFFER_SIZE) { 
     f << s; 
     f.flush(); 
     s.clear(); 
    } 

} 

f << s; 
f.flush(); 
f.close(); 

基本上,你構建內存中的數據流,而不是重定向到流,所以你不必擔心流何時被刷新。當你重定向時,你要確保它被刷新到實際的文件中。 OPTIMUM_BUFFER_SIZE的一些想法可以從herehere找到。

我不太確定字符串或向量是否是緩衝區的最佳選項。我會自己做一些研究並更新答案,或者您可以參考斯科特邁耶斯的Effective STL

+1

如果'igzstream'確實在使用內存,寫入字符串或向量是多餘的。這個解決問題甚至改變任何東西的唯一部分就是'flush()'。 – EJP

+1

@EJP:除了'flush()'是'ostream'的成員,而不是'istream'。 –

+0

@BenVoigt也許你誤解了我的意思。這些功能是將數據連接成一個字符串,並在最佳寫入大小時(例如,與I/O緩衝區大小相同)將其寫入文件。沒有答案的地方,它表明連接的數據被來自文件的數據覆蓋*。不明白你爲什麼低調投票? – ubi

1

如果這確實是程序卡住的代碼,那麼您對問題的解釋是錯誤的。

  • 沒有文本文件。您的igzstream不是處理文本,而是一個gzip存檔。

  • 沒有數據被寫入。您顯示的代碼從流中讀取

  • 我不知道你的程序用結果是幹什麼用的,因爲你沒有顯示出來。但是,如果它將結果累積到內存中的集合中,結果將會增長。您需要找到一種方法來處理所有數據,而無需同時將所有數據全部加載到RAM中。

  • 您的內存使用情況可能來自解壓縮程序。對於某些壓縮算法,整個塊必須存儲在內存中。在這種情況下,最好將文件分成塊並分別進行壓縮(可能會用前一個塊的結果預先初始化字典)。然而,我不認爲gzip是這樣一種算法。您可能需要找到支持流式傳輸的庫。

+1

其實我的代碼是巨大的,沒有必要把整個代碼放在這裏。我的代碼工作「很好」:它計算我nedd的結果,並將其寫入txt文件。問題是當txt文件變得太大時,內存消耗會爆炸。這是evry晚了,我錯誤地鍵入(複製+粘貼錯誤的代碼部分)2件事情('ogzstream'而不是'ostream'和'>>'而不是'<<)。感謝您指出錯誤,但下次您可能會變得更謙虛,更不積極。 – DanielX2010

+1

@ DanielX2010:告訴專家試圖幫助你變得更謙虛通常不是一個好主意。更機智/不太侵略;好的,我會給你。無論如何,你發佈了一個非常含糊的問題,這足以讓許多專家一起前進,找到一個更好的書面問題。我看到有些答案涉及描述,並假設代碼有缺陷,所以我選擇提供一個答案,如果代碼是正確的並且描述有缺陷,這將是有幫助的。 –

+0

+ +1爲更加剋制的職位。關於這些問題的模糊信息在這裏是相同的,所以需要一些限制。我錯誤地建議flush()讀取文件,但問題聽起來像是一個衝突問題,可能是。 (如果你再次編輯它,我會刪除我的downvote。) – Jiminion