2017-08-07 11 views
2

私は、idxという名前の列を持ついくつかのファイルがあります。インデックスとして使用したいと思います。得られたデータフレームは約13M行あります。私は(40ミリ秒〜速いです)データフレームの既知の分け目とパフォーマンス

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

簡単な操作

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

またはこれ以外の方法で、私は(〜遅くなる40秒)このようにインデックスを読み、割り当てることができることを知っています2番目の方法で長さを計算すると〜4倍高速です。私は理解していないと、第二のdf.known_divisionsリターンTrueしばらく最初のケースに

  • あるFalseです。私は反対の行動を期待した。私はその後、dfの上にいくつかの操作を行いました。私はいつもより良いパフォーマンスを得ています。私はこれが意図的に起こっているかどうかを知るために頭を悩ましています。
  • パーティション数はファイル数です。別の数のパーティションを設定するにはどうしたらいいですか?

UPDATE はそれだけで速くなるlenを計算されていません。私の計算では、私はGROUPBYを使用して4つの新しいデータフレームを作成し、いくつかの回を適用し、参加し、これらは、あなたが最初のメソッドを使用する場合

|     |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

更新:これは、シャッフル時間のコストを償却するために1つの計算で複数の計算を行った場合と、シャッフルのメモリコストが何である場合でも、あなたのgroupbyなどが正確に何であるかによって異なります。多くの場合、作業に十分なRAMがあれば、set_indexの後に持続することを選択することがあります。 – mdurant

+0

私は持続を確認し、パフォーマンスについてより具体的な質問をします。 – user32185

答えて

0

タイミングは、DASKは、データをロードし、そしてあなたの値で行を分割されていますあなたが求めた計算を実行する前に、選択した列(ディスク上のすべてのチャンクをシャッフルすること)が必要です。長さを計算する場合には、これは全ての時間の浪費である。なぜなら、索引区分の知識はそれでは全く役に立たないが、その索引を含むさらなる計算(例えば、結合操作)ははるかに速いからである。

2番目のバージョンでは、選択した列がインデックスであると主張していますが、daskは明示的に要求せずにデータをシャッフルしません。パルケのメタデータに統計情報が保存され、各寄せ集まりの最大/最小値がそのようなものである場合、それらは単調な系列を形成します(つまり、2番目のチャンクの 'idx'の値はすべて最初の値など)、それまでと同じように、索引を含む特定の操作の分割と最適化されたパフォーマンスが分かります。これらの条件が満たされていない場合、インデックス列は設定されていますが、部門は分かりません。長さの計算には完全に適しています。

関連する問題