簡體   English   中英

大熊貓Dataframe並行處理

[英]Large Pandas Dataframe parallel processing

我正在訪問一個非常大的Pandas數據幀作為全局變量。 通過joblib並行訪問此變量。

例如。

df = db.query("select id, a_lot_of_data from table")

def process(id):
    temp_df = df.loc[id]
    temp_df.apply(another_function)

Parallel(n_jobs=8)(delayed(process)(id) for id in df['id'].to_list())

以這種方式訪問​​原始df似乎是跨進程復制數據。 這是意料之外的,因為原始df在任何子進程中都沒有被改變? (或者是嗎?)

對於joblib創建的每個進程,需要對整個DataFrame進行pickle和unpickled。 在實踐中,這非常慢並且還需要很多次的記憶。

一種解決方案是使用表格格式將數據存儲在HDF( df.to_hdf )中。 然后,您可以使用select來選擇數據子集以進行進一步處理。 在實踐中,這對於交互式使用來說太慢了。 它也非常復雜,您的工作人員需要存儲他們的工作,以便在最后一步中進行整合。

另一種方法是使用target='parallel'探索numba.vectorize 這將需要使用NumPy數組而不是Pandas對象,因此它也有一些復雜性成本。

從長遠來看, dask希望為Pandas帶來並行執行,但這不是很快就會有所期待的。

正如您所指出的,Python多處理通常使用單獨的進程完成,這意味着進程不共享內存。 有一個潛在的解決方法,如果你可以使用np.memmap工作,如同在joblib文檔中稍微提到的那樣,雖然轉儲到磁盤顯然會增加它自己的一些開銷: https ://pythonhosted.org/joblib/parallel 。 HTML#工作與-數值-數據-在共享存儲器-memmaping

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM