2016-06-17 5 views
0

誤って、多くのヶ月前、私は基本的にPCollectionViewのasList()メソッドと同じ機能を実装するために、次のロジックを使用:なぜ私のカスタムCombineFnまたはasList()より "グループ化"が非常に遅いのですか?

  1. 私は私のコレクション
  2. 内のすべての要素に「000」のダミーのキーを割り当て
  3. 私はその後、私は基本的に単一の配列リスト内のすべての私の要素

のリストになるだろうように、私は私のコレクションには約200の要素を持っていた時には、上記のロジックがうまく働いた。このダミーのキーにGROUPBYをしました。私は5000要素でそれを実行したとき、私はそれが最終的にそれを殺すまで数時間走った。次に、カスタム "CombineFn"を作成しました。ここでは基本的にすべての要素を自分のローカルハッシュテーブルに入れました。それはうまくいって、5000要素の状況でさえ、それは約1分以内に実行されました。同様に、私は後で、asList()メソッドを使用できることを知り、それも1分以内に実行されました。しかし、私にとって心配しているのは、私が理解していないことです。なぜなら、グループの実行には時間がかかっていました(200個の要素でも数秒以上かかるでしょう)。何でも

私はコードでグループを見ましたが、それはかなり分かりませんでした。私はそれがどういうわけか、group byステートメントがクラスタ?それとも効率的なコーダーを使用することに関連しているのでしょうか?あるいは私は何か他のものを逃していますか私が尋ねる理由は、データセットが大きすぎて単一のコンピュータのRAMに収まらないため、グループごとのステートメントを強制的に使用する状況があるということです。しかし、私は、文章でグループを適切に使う方法を理解していないことを心配しています...

答えて

1

低速のパフォーマンスに寄与する可能性のあることがいくつかあります。まず、SerializableCoderを使用している場合、それはかなり遅く、AvroCoderはおそらくあなたのためにうまくいくでしょう。第2に、GBKの後でParDoのIterableを繰り返し実行している場合、十分な要素があれば、キャッシュを超えて同じデータを何度もフェッチすることになります。これを行う必要がある場合は、明示的にデータをコンテナに入れることが役に立ちます。 CombineFnとasListの両方のアプローチがこれを行います。

関連する問題