2016-04-02 27 views
2

我有一個很大的csv文件,我需要處理每一行來計算一些單詞。我需要使用一些MPI方法在多個進程之間分配數據處理。目前,我正在使用分散/收集mpi4py庫。問題是我需要創建一個長度等於進程數量的數組。但是,在創建大行數列表時,出現內存錯誤。MPI散佈以分發大型csv文件

size = comm.Get_size() 
f=open('x.csv') 
lines=[[] for _ in range(size)] 
for line in f: 
    # this line raises memory error after about 250000 rows are appended 
    lines[i%size].append(line) 

是否有另一種方法在這些進程之間傳輸大數據?

+1

1)這是否在多個節點上運行? 2)這是一個共享文件系統嗎?一般來說,你很可能不會**你的方法獲得性能,而不是連續計數你的話,因爲這可能受磁盤I/O帶寬而不是計算的限制。 – Zulan

+0

@Zulan是的,我有多個節點和共享文件系統。目前性能對我來說並不那麼重要,我只想測試和使用我的文件上的MPI庫 – stardiv

回答

1

您bascially有以下選擇:

  1. 過程在塊,例如數據讀取200k行,分散,收集結果,重複。
  2. 在本地讀取數據,例如每個等級上的文件的1/size。這可能很難有效地進行。您無法有效地尋找到csv文件中的特定行。所以你必須按照文件大小seek將文件分隔到分割的位置,找到下一個換行符並從那裏開始工作,直到文件結束後的第一個換行符。
  3. 將兩者結合。

但是再次,你可以只是逐行處理文件,在你計算出它的單詞之後扔掉每一行。

P.S.考慮csv模塊。