2013-01-21 45 views
1

我有一個有點問題與並行讀取如何從與MPI的文本文件和讀取整數C++

我有一個文本文件,它看起來像這樣:

1 4 30 46 
0 2 3 29 
1 11 12 -1 
1 4 5 -1 
0 3 13 14 
3 6 7 8 
5 10 -1 -1 
13 10 -1 -1 
5 9 27 -1 

和我「M試圖在每個處理的時間來讀取這些整數4,文件的行的數量等於工序的數量和每行包含4個整數

int bufsize, count; 
int *buf; 
MPI::Status status; 

MPI::File top = MPI::File::Open(MPI::COMM_WORLD, "top.txt", MPI::MODE_RDONLY, MPI::INFO_NULL); 

MPI::Offset filesize = top.Get_size(); 
filesize = filesize/sizeof(int); 
bufsize = filesize/wasteland_size + 1; 

buf = new int[bufsize * sizeof(int)]; 

top.Set_view(my_rank * bufsize * sizeof(int), MPI_INT, MPI_INT, "native", MPI::INFO_NULL); 
top.Read(buf, bufsize, MPI_INT, status); 
count = status.Get_count(MPI_INT); 

top.Close(); 

這是我使用的代碼。

它編譯沒有錯誤或警告,但它輸出的東西線:

540287025 874524723 805969974 857748000 

每個進程。

+1

這裏你會遇到問題,因爲你的線條長度不一樣;有8,9,10,11和12個字符的行。因此,簡單地將文件大小除以處理器數量(或其他數據)並將其讀入是不太可能的。您可以使用與此答案相同的方法(http://stackoverflow.com/a/12942718/463827)來劃分文件,並在後處理步驟中根據需要執行任何負載平衡。但是一般來說,文本文件對於並行I/O來說並不好。 –

+0

我從另一個創建該文件,因爲我需要它被格式化爲這樣(我正在讀圖中的節點的鄰居),所以我可以修改它,但我不知道是什麼樣的文件使用,所以我可以正確讀取它,我應該使它二進制?什麼是在這種情況下使用的最佳文件類型? –

+1

我會:(一)創建它作爲一個二進制文件; (b)對它進行預處理,在運行之前將其分割成正確數量的子文件(例如'split -lines = N top.txt',其中N是每個處理器的行數)並讓每個處理器讀取它自己的文件;或者,如果文件不是很大,(c)用一個處理器讀取它,然後使用'MPI_Scatter()'或'MPI_Scatterv()'分發數據。我們可能可以一起拼湊一些能夠在相關答案中使用MPI-IO的方法,但除非有其他一些令人信服的理由,否則我傾向於認爲這會比它的價值更麻煩。 –

回答

2

問題是你的文件是一個文本文件,但它不被解釋爲這樣。您正在從二進制文件中讀取整數。

當您將這些數字中的任何一個轉換爲十六進制數時,您會發現它們由代表ASCII或數字的空間組成。

我會建議更改文件格式,以便每個數字代表4個字節。這也允許你按照你所做的方式分割文件。

+0

這也是事實。 –