11

大量のデータ セット (>2000 エンティティ) をロードし、このセットに対して計算を実行する必要があるアプリケーションの一部があります。各エンティティのサイズは約 5 KB です。

最初の単純な実装では、ボトルネックはすべてのエンティティをロードするのに必要な時間 ( 2000 個のエンティティで約 40 秒) であると思われますが、計算自体を実行するのに必要な時間は非常に短いです (<1 秒)。

エンティティの取得を高速化するために、いくつかの戦略を試しました。

  • 取得リクエストを複数の並列インスタンスに分割し、結果をマージする: 2000 個のエンティティに対して約 20 秒
  • 常駐バックエンドに配置されたインメモリ キャッシュにエンティティを格納する: 2000 エンティティの場合、約 5 秒

計算は動的に計算する必要があるため、書き込み時に事前計算を行って結果を保存することは、このケースでは機能しません。

1 秒弱で最大 2000 個のエンティティを取得できることを期待しています。これはGAE/Jの能力の範囲内ですか?この種の検索のために実装できる可能性のある他の戦略はありますか?

更新: ユース ケースと並列化の結果に関する追加情報を提供します。

  • データストアには同じ種類のエンティティが 200.000 を超えており、操作は取得のみです。
  • 10 個の並列ワーカー インスタンスで実験を行い、得られた典型的な結果をこのペーストビンで確認できます。エンティティをマスター インスタンスに戻すときに必要なシリアライゼーションとデシリアライゼーションがパフォーマンスを妨げているようです。

更新 2: 私たちがやろうとしていることの例を挙げます:

  1. 良い投資かどうかを知るために分析する必要がある StockDerivative エンティティがあるとします。
  2. 実行される分析には、外部 (ユーザーの好み、市況など) と内部 (エンティティのプロパティなど) の両方の多くの要因に基づく複雑な計算が必要であり、単一の「投資スコア」値が出力されます。
  3. ユーザーは、その投資スコアに基づいてデリバティブをソートするように要求し、最高スコアの N 個のデリバティブを提示するように要求することができます。
4

5 に答える 5

4

200.000 x 5kb は 1GB です。これらすべてを最大のバックエンド インスタンスのメモリに保持すること、複数のインスタンスを持つこともできます。これが最速の解決策です。メモリに勝るものはありません。

計算のために各エンティティの 5kb 全体が必要ですか? 計算前にクエリを実行するときに、200k エンティティすべてが必要ですか? クエリはすべてのエンティティに影響しますか?

また、BigQueryもご覧ください。それはあなたのニーズに合うかもしれません。

于 2012-01-05T21:32:12.767 に答える
1

Memcacheを使用します。それで十分かどうかは保証できませんが、そうでない場合は、おそらく別のプラットフォームに移動する必要があります。

于 2012-01-05T17:02:06.563 に答える
0

これは非常に興味深いことですが、確かにその可能性があります。

私も同じことをしたでしょう。マップ削減の概念

使用している並列インスタンスの数と、各インスタンスの結果について、さらにメトリックを提供していただければ幸いです。

また、私たちのプロセスには、検索のみ、または検索と保存が含まれます。

データ ストアにはいくつの要素がありますか? 4000? 10000?理由は、前のリクエストからキャッシュできるからです。

よろしく

于 2012-01-05T14:33:04.337 に答える
0

最終的に、単一のインスタンスから 2000 個を超えるエンティティを 1 秒未満で取得できるようには見えないため、元の質問で説明したように、バックエンド インスタンスに配置されたメモリ内キャッシュを使用する必要があります。誰かがより良い答えを思いついた場合、またはこの問題に対するより良い戦略/実装を見つけた場合は、受け入れられた答えを変更または更新します.

于 2012-04-22T13:34:16.203 に答える
0

私たちのソリューションでは、バックグラウンド タスクでエンティティを定期的に読み取り、その結果を JSON BLOB に保存します。そうすれば、10 万行を超える行をすばやく返すことができます。すべてのフィルタリングとソートは、SlickGrid の DataView モデルを使用して JavaScript で行われます。

誰かがすでにコメントしているように、MapReduce は GAE への道です。残念ながら、MapReduce の Java ライブラリは壊れているため、最適ではないタスクを使用してすべての読み取りを行っていますが、近い将来に MapReduce (および/またはパイプライン API) を使用する予定です。

前回チェックしたとき、Blobstore は 1MB を超える gzip されたエンティティを返さなかったので、現時点では、圧縮されたエンティティからコンテンツをロードしてメモリに展開していることに注意してください。これにより、最終的なペイロードが gzip されます。私はそれが好きではありません.それはレイテンシーをもたらします.GZIPの問題をすぐに修正してくれることを願っています.

于 2012-09-26T00:37:53.103 に答える