[英]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.