簡體   English   中英

為什么在過濾后的 Dask 數據幀上運行計算()需要這么長時間?

[英]Why does running compute() on a filtered Dask dataframe take so long?

我正在使用這個讀取數據: ddf1 = dd.read_sql_table('mytable', conn_string, index_col='id', npartitions=8)

當然,由於延遲計算,這會立即運行。 這個表有幾億行。

接下來,我想過濾這個 Dask 數據框:

ddf2 = ddf1.query('some_col == "converted"')

最后,我想將其轉換為 Pandas 數據幀。 結果應該只有大約 8000 行:

ddf3 = ddf2.compute()

但是,這需要很長時間(約 1 小時)。 我能否就如何大幅加快速度獲得任何建議? 我試過使用.compute(scheduler='threads') ,改變分區的數量,但到目前為止都沒有工作。 我究竟做錯了什么?

首先,您可以使用 sqlalchemy 表達式語法對查詢中的過濾器子句進行編碼,並在服務器端進行過濾。 如果數據傳輸是您的瓶頸,那么這就是您的最佳解決方案,尤其是過濾器列已編入索引。

根據您的數據庫后端,sqlalchemy 可能不會釋放 GIL,因此您的分區無法在線程中並行運行。 你得到的只是線程之間的爭用和額外的開銷。 您應該對進程使用 分布式調度程序。

當然,看看你的CPU和內存使用情況; 使用分布式調度程序,您還可以訪問診斷儀表板。 您還應該關心每個分區在內存中的大小。

暫無
暫無

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

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