2017-08-07 60 views
2

我有幾個文件以一列,其被稱爲idx,我想用它作爲指標。獲得的數據幀大約有13M行。我知道我可以閱讀並以這種方式分配指標(這是慢〜40秒)DASK dataframes known_divisions和性能

df = dd.read_parquet("file-*.parq") 
df = df.set_index("idx") 

或在此的其他方式(這是快速〜40毫秒)

df = dd.read_parquet("file-*.parq", index = "idx") 

通過簡單的操作因爲用第二種方法計算的長度快了4倍。我不明白的是

  • 在第一種情況下df.known_divisions回報True,而第二個是False。我預料到了相反的行爲。然後,我在df之上做了幾次操作,沒有知名度我總是獲得更好的性能。我在摸索着想弄清楚這是否有意或無意。
  • 分區的數量是文件的數量。我如何設置不同數量的分區?

UPDATE 它不只是計算len這是更快。在我的計算,我創建使用GROUPBY,申請和參加了幾次4個新dataframes而這些都是定時

|     |Load and reindex (s)|Load with index (s)| 
|:-----------------|-------------------:|------------------:| 
| load    |   12.5000 |   0.0124 | 
| grp, apply, join |   11.4000 |   6.2700 | 
| compute()  |   146.0000 |   125.0000 | 
| TOTAL   |   169.9000 |   131.2820 | 
+0

要將更新:這將取決於究竟你GROUPBY等等,都是,無論你在一個單一的計算做一些計算(分期償還洗牌時間成本),什麼洗牌的存儲成本。通常,如果有足夠的RAM可用,人們可以選擇在set_index之後保留。 – mdurant

+0

我會檢查堅持並提出一個更具體的性能問題。 – user32185

回答

0

當您使用第一種方法,DASK加載數據,並通過價值分割行的在執行任何你所要求的計算之前,選擇一列(涉及將所有的光盤塊混洗)。在計算長度的情況下,這都是浪費時間,因爲指數師的知識,不利於與所有,但涉及該指標(例如,連接操作)進一步計算將要快得多。

在第二個版本,您聲稱你所選擇的列索引,但沒有您明確要求它DASK不洗牌的數據。如果恰好有保存在拼花元數據統計,並且每個鑲塊的最大/最小是這樣,即它們形成一個單調系列(即,所有在第二塊「IDX」的值的比都大於第一個中的值等),那麼您將具有已知的分區並針對涉及該索引的某些操作優化性能,如前所述。如果這些條件沒有得到滿足,那麼您將設置索引列,但不知道這些分區 - 這對計算長度來說也是完全正確的。