2016-02-10 58 views
1

所以我正在閱讀大量不同文件的大量數據。數據中有一個主要的速度障礙。問題是這些文件在它們的時間步的相應目錄中,其中包含該時間步的每個變量。所以基本上我有一些看起來像這樣的功能。內存錯誤並行Python(大數據並行)

def ReadFiles(path,points,directories,variables): 
    data = {} 
    for j in range(len(variables)): 
     data[variables[j]] = np.zeros((len(timeDirs),numPts)) 
     for i in range(len(timeDirs)): 
     tfile = str(path) + "/" + str(timeDirs[i]) 
     for j in range(len(variables)): 
      job_server.submit(ReadData,(args,data,i,j),modules=("np",)) 
def ReadData(args): 
    update path for the particular variable 
    read in data from file 
    data[variables[j]][i] = that data 

TLDR初始化我有numpy的陣列劃分爲字典中的變量。然後更新並行化的另一個函數中的正確部分。

我正在使用並行python。我想在某個時候將這些代碼移到集羣中。我得到的錯誤是

File "/home/steven/anaconda2/lib/python2.7/site-packages/pp.py", line 460, in submit 
    sargs = pickle.dumps(args, self.__pickle_proto) 
MemoryError: out of memory 

從看我的內存使用情況,我可以看到,RAM上升,然後交換開始填充。一旦兩個都滿了,我得到錯誤。從一些閱讀中我收集到,這些過程中的每一個都正在傳遞一個新的字典,這意味着並行更新不是一種選擇。

我會注意到,當我串行運行時,我不會得到這個內存錯誤。那麼有沒有一種好方法可以將這些數據存儲或傳遞迴我的詞典?最終的數據存儲在一個hdf5文件中,但這些文件似乎並不想打開並寫入。

有沒有很好的解決方案?如何並行處理大量數據?

回答

0

並行讀取數據不可能爲您帶來任何收益,因爲只要您一次讀取數據,一次讀取一個文件或一次讀取數據,您就會受到I/O限制。我會切換它來連續讀取數據,但是一旦每個文件被加載,啓動數據設置(並行,natch)。如果你可以一次加載整個文件,然後從內存中處理它,你可能會看到你尋求的性能提升,但會以內存爲代價。

如果您正在耗盡內存,那麼您需要弄清楚如何寫出一些數據,以便您可以刪除這些字典條目。

對存儲器映射文件而不是顯式讀取文件可能是可行的,然後根據數據處理速度與I/O速度的不同,並行處理可能更有意義。這將允許您利用操作系統的調度,假設您的數據處理在加載時足夠長。

+0

創建後轉儲字典很快。問題在於閱讀。我正在獨立閱讀每個數據文件。我只想平行閱讀這些內容。這看起來像是浪費了計算機的能力,只需讀取我的所有數據即可。 我將如何做一個內存映射? –

+0

此外,正如我在操作中所說,我沒有在系列 –

+0

內存錯誤您不會看到任何速度優勢並行讀取,如果你可以飽和I/O串行。這就是我提出這個建議的原因。如果您已經儘可能快地讀取儘可能多的數據,這不會浪費電腦的電量。 –