私のPython High Replication Datastoreアプリケーションでは、100,000〜1,000,000の大きなルックアップテーブルが必要です。私はそのコードに関連付けられた値を返すメソッドにコードを提供する必要があります(関連がない場合はNone)。たとえば、私のテーブルが受け入れ可能な英語の単語を保持していたら、単語が見つかった場合はTrueを返し、そうでない場合はFalse(またはNone)を返すようにします。GAEルックアップテーブルはトランザクションと互換性がありませんか?
私の現在の実装は、各テーブルエントリに対して1つの親なしエンティティを作成し、そのエンティティに関連するデータを格納することです。そのエンティティのデータストアキーをルックアップコードと同じに設定しました。 (キーの競合を防ぐために、すべてのエンティティを独自の名前空間に配置しますが、この質問には必須ではありません)。次に、コードでget_by_key_name()を呼び出して、関連するデータを取得します。
問題は、エンティティグループにまたがっているため、トランザクション中にこれらのエンティティにアクセスできないことです。そこで私の例に戻って、チャットセッションで使用されたすべての単語のスペルチェックをしたいとしましょう。私は彼らに共通の祖先を与えるので、私はチャットのすべてのメッセージにアクセスできましたが、そこには親がないので、私はワードテーブルにアクセスできませんでした。トランザクション中にテーブルを参照することが不可欠です。
私のルックアップテーブルは修正されているか、まれにしか変更されていません。これもスペルチェックの例と一致します。
1つの解決策は、1つのトランザクション中にチャットセッション内のすべての単語を読み込み、スペルチェック(結果の保存)して、保存された結果に対してスペルチェックを行う2回目のトランザクションを開始することです。しかし、これは非効率的であるだけでなく、チャットセッションがトランザクション間に追加された可能性があります。これは不器用な解決策のようです。
理想的には、ルックアップテーブルが不変であることをGAEに伝えたいと思います。このため、トランザクション内でエンティティグループをスパンすることについて不平を言わずにクエリを実行できるはずです。しかし、これを行う方法はありません。
memcacheにテーブルエントリを格納するのは魅力的ですが、それにも問題があります。大量のデータですが、GAEがmemcacheエントリを起動すると、トランザクション中にGAEが再ロードできなくなるという問題があります。
大きなグローバルルックアップテーブルの適切な実装について知っている人はいますか?
私はスペルチェックWebサービスなどを探しているわけではありません。私は、この質問を明確にするためだけに単語検索を例として使用しています。私は、大規模なルックアップテーブルのあらゆる種類の一般的な解決法を期待しています。
+1をメモリに入れることを提案します。固定データの場合、これは最適である可能性が高い。 – SingleNegationElimination
最初の提案に関しては、トランザクションを開始する前にテーブルをデータストアに保持してから、テーブル全体をインスタンスメモリに読み込むことが正しく理解できますか?それはうまくいくだろうが、テーブルは3MBのようなものを占めており、私はほんの一握りのテーブル参照しか必要としません。したがって、私が必要とするすべてが数百バイトであり、非効率的であると思うと、私は3MBで読んでいます。それとも他の何かを提案していますか?インスタンスメモリが(memcacheへの書き込みを除いて)リクエストに生き残る方法はありませんか? (そしてあなたの返事に感謝します - 日曜の夜はそれほどではありません!) – Dragonfly
あなたの他のアイデアについては、私は "リビジョンプロパティ"のアイデアを理解しており、それと一緒に行くことができます。私はまだブロブストアやバックエンドについて学んでいないので、次にそれらを研究します。私はバックエンドを使うという音が好きです。その解決策には何らかの欠点がありますか? P.S.私はまだ、GAEをサポートすることで、トランザクションによってアクセスできる不変のデータストアエンティティをサポートすることをお勧めします。 – Dragonfly