2015-03-13 58 views
0

我正在使用MPI和C++一起使用。我想從一個文件中讀取信息,按照某個規則修改它,然後在同一個文件中寫入修改過的內容。我使用臨時文件,該文件在那裏我存儲經修改的內容,並在結束時,我通過這些命令覆蓋它:使用MPI/C++修改讀取big .txt文件?

temp_file.open("temporary.txt",ios::in); 
ofstream output_file(output_name,ios::out); 
output_file<<temp_file.rdbuf(); 
output_file.flush(); 
temp_file.close(); 
output_file.close(); 
remove("temporary.txt"); 

其中修改文件這個功能是通過MPI過程與秩0所執行從功能退出後,MPI_Barrier(MPI_COMM_WORLD);被調用以確保同步。 然後,所有的MPI進程都應該讀取已修改的文件並執行一些計算。問題在於,由於文件太大,當功能執行完成時,數據沒有完全寫入文件,並且出現錯誤的結果。我也試着把sleep()命令,但有時它的工作原理,有時它不(這取決於我執行計算的節點)。有通常的方法來解決這個問題嗎? 我把MPI作爲標籤,但我認爲這個問題本質上與C++標準相關,並且與存儲操作有關。如何處理寫入緩衝區a和寫入存儲介質的文件之間的延遲?

回答

1

有趣的話題。你在這裏處理兩個或者三個一致性語義。

POSIX一致性說,基本上當一個字節寫入文件時,它是可見的。

NFS一致說「哇,這太辛苦。你寫這個文件,我會讓它可見,每當我喜歡它的感覺。」

MPI-IO一致性語義(你不使用,但很好知道)說特定同步事件發生後數據是可見的。這兩個事件是「關閉文件並重新打開它」或「同步文件,屏障,同步文件」。

如果您使用NFS,請立即放棄。 NFS非常糟糕。有很多很好的並行文件系統可以使用,其中幾個完全可以在用戶空間中設置(如PVFS)。如果你在這裏使用MPI-IO,你會得到更好的定義行爲,但是MPI-IO例程比C++ iostream操作符更像C系統調用,所以更像open(2)read(2) )寫(2)並關閉(2)。文本文件通常是一個頭痛的問題,但在你的情況下,修改被附加到文件中,這應該不會太糟糕。