大量のデータ セット (>2000 エンティティ) をロードし、このセットに対して計算を実行する必要があるアプリケーションの一部があります。各エンティティのサイズは約 5 KB です。
最初の単純な実装では、ボトルネックはすべてのエンティティをロードするのに必要な時間 ( 2000 個のエンティティで約 40 秒) であると思われますが、計算自体を実行するのに必要な時間は非常に短いです (<1 秒)。
エンティティの取得を高速化するために、いくつかの戦略を試しました。
- 取得リクエストを複数の並列インスタンスに分割し、結果をマージする: 2000 個のエンティティに対して約 20 秒。
- 常駐バックエンドに配置されたインメモリ キャッシュにエンティティを格納する: 2000 エンティティの場合、約 5 秒。
計算は動的に計算する必要があるため、書き込み時に事前計算を行って結果を保存することは、このケースでは機能しません。
1 秒弱で最大 2000 個のエンティティを取得できることを期待しています。これはGAE/Jの能力の範囲内ですか?この種の検索のために実装できる可能性のある他の戦略はありますか?
更新: ユース ケースと並列化の結果に関する追加情報を提供します。
- データストアには同じ種類のエンティティが 200.000 を超えており、操作は取得のみです。
- 10 個の並列ワーカー インスタンスで実験を行い、得られた典型的な結果をこのペーストビンで確認できます。エンティティをマスター インスタンスに戻すときに必要なシリアライゼーションとデシリアライゼーションがパフォーマンスを妨げているようです。
更新 2: 私たちがやろうとしていることの例を挙げます:
- 良い投資かどうかを知るために分析する必要がある StockDerivative エンティティがあるとします。
- 実行される分析には、外部 (ユーザーの好み、市況など) と内部 (エンティティのプロパティなど) の両方の多くの要因に基づく複雑な計算が必要であり、単一の「投資スコア」値が出力されます。
- ユーザーは、その投資スコアに基づいてデリバティブをソートするように要求し、最高スコアの N 個のデリバティブを提示するように要求することができます。