4

テーブル内のすべてのエンティティを一括読み込みする必要があります。(高速オンデマンド グラフ トラバーサル アルゴリズムのために、必要に応じてロードするのではなく、メモリ内に配置する必要があります。)

読み込み速度を上げるために、これを並列化する必要があります。したがって、複数のクエリを並列スレッドで実行し、それぞれが約をプルしたいと考えています。データベースからの 800 エンティティ。

QuerySplitterはこの目的を果たしますが、フレキシブル環境で実行しているため、クライアント ライブラリではなく Appengine SDK を使用しています。

MapReduce について言及されていますが、これは単純なデータのメモリへのロードを目的としたものではありません。Memcache は多少関係がありますが、高速アクセスのためには、これらすべてのオブジェクトが、自分のアプリの JVM の RAM にある密集したネットワークに必要です。

MultiQueryBuilderがこれを行う可能性があります。クエリの一部を並行して実行する際の並列性を提供します。

これら 3 つのアプローチのいずれを使用するか、または他のアプローチを使用するかに関係なく、最も困難な部分は、テーブル (Kind) を 800 程度のエンティティのチャンクに大まかに分割するフィルターまたはその他の形式のスピットを定義することです。「1 から 800 までのオブジェクト」、「801 から 1600 まで、...」というフィルターを作成しますが、それが非現実的であることはわかっています。それで、どうやってそれをするのですか?

4

1 に答える 1

1

エンティティをランダムなグループに分割することで、同様の問題を解決しました。

各データストア エンティティに float プロパティを追加し、エンティティを保存するたびに 0 ~ 1 の乱数を割り当てました。次に、Nスレッドを起動してさまざまなデータストア エンティティを処理するときに、エンティティのクエリに対して各スレッドを処理させました1/N。たとえば、スレッド 0 は、 と の間0に設定されたランダム プロパティを持つすべてのエンティティを処理し1/Nます。1/Nスレッド 2 は、との間のランダム プロパティを持つすべてのエンティティを処理します2/N

これの欠点は、完全に確定的ではなく、データストア エンティティに新しいプロパティを追加する必要があることです。利点は、数百万のエンティティとスレッドに簡単にスケーリングできることであり、通常、スレッド間で作業を均等に分散できます。

于 2016-05-25T05:00:23.363 に答える