簡體   English   中英

Dask數據框加入速度慢

[英]Dask dataframe join slow as pandas

我有2個數據框,一個叫做動漫〜約1萬行數據,一個叫做動漫列表〜約3000萬行數據,並且想要加入它們。 我用pandas進行了基准測試,它的速度只有7%左右,還不算很多,我想知道如果我有16個內核,是否可以更快。

我有熊貓數據框,我在那里設置索引

animes = animes.set_index('anime_id')
animelists = animelists.set_index('anime_id')

數據看起來像這樣(我省略了其他專欄),動漫:

anime_id | genres
-------- | ------
11013    | Comedy, Supernatural, Romance, Shounen
2104     | Comedy, Parody, Romance, School, Shounen
5262     | Comedy, Magic, School, Shoujo

和動漫演員:

anime_id | username | my_score
21       | karthiga | 9
59       | karthiga | 7
74       | karthiga | 7

然后我據此創建了Dask Dataframes

animes_dd = dd.from_pandas(animes, npartitions=8)
animelists_dd = dd.from_pandas(animelists, npartitions=8)

我想有效地將​​各個動漫類型與動漫列表結合起來,以按類型查詢分數。 我在熊貓這里有執行此操作的代碼:

genres_arr = animes['genres'].str.replace(' ', '').str.split(',', expand=True).stack().reset_index(drop=True, level=1).to_frame(name='genre')
genres_arr = genres_arr[genres_arr['genre'] != '']
resulting_df = animelists.merge(genres_arr, how='inner', left_index=True, right_index=True)
# this takes 1min 37s

和dask中的相同代碼:

genres_arr_dd = animes_dd['genres'].map_partitions(lambda x: x.str.replace(' ', '').str.split(',', expand=True).stack().reset_index(drop=True, level=1)).to_frame(name='genre')
genres_arr_dd = genres_arr_dd[genres_arr_dd['genre'] != '']
resulting_dd = animelists_dd.merge(genres_arr_dd, how='inner', left_index=True, right_index=True).compute()
# this takes 1min 30s

(結果數據框具有約1.4億行)

有什么辦法可以加快速度嗎? 我遵循了官方的性能指南 ,我在索引列上執行聯接,並且在每個Dask Dataframe上都有8個分區,因此應該為有效的多處理聯接做好准備。

這里有什么問題,我應該如何進一步加快速度?

當我在jupyter筆記本中運行代碼時,我正在觀察每個內核的CPU利用率,而且該利用率非常低,有時,只有一個內核處於活動狀態,並且以100%的速度運行。 似乎並不能很好地並行化。

在其他地方已經重復了這一步驟,因此我將非常簡短。

  • from_pandas-> compute意味着您正在往返所有數據; 您要加載工作程序(例如dd.read_csv)並在工作程序中進行匯總,而不是將整個數據集移入或移出

  • 調度程序的選擇非常重要。 如果系統監視器說您正在使用一個CPU,則您可能受到GIL的限制,應該嘗試使用適當的進程/線程混合的分布式調度程序。 它還將在其儀表板上為您提供有關發生情況的更多診斷信息

  • Pandas速度很快,並且當數據較小時,雖然額外的開銷也很小,但可能會超過您獲得的任何並行度。

暫無
暫無

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

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