2011-09-15 5 views
0

私はスケーラビリティーの問題に直面しています。私はJDOを使って自分のデータストアを照会しています。 特定のエンティティのすべてのキーを取得する必要があります(このようなキーはLong型です)。私のデータストアでは、このようなエンティティにはレコードが1.000.000あるので、バックグラウンドタスクでこのセットをループするには、非常に効率的な方法で取得する必要があります。GoogleAppEngineのJDO:膨大な数のレコードからフィールドのサブセットを効率的に取り出す方法

これを行う最も効率的な方法はどれですか?

また、キーだけでなく別のフィールドが必要な場合はどうすればいいですか?

Long idPic; //this is my key 
    String title; //this is the field I want to retrieve together with the key 
    ... // other properties 

単一の効率的なクエリでidPicとタイトルの両方を取得するにはどうすればよいですか?

Query q = new Query("select idPic, title from " + TPImage.class.getName()); 

が、より効率的な何か?

ありがとうございました!あなたがそれらを効率的に十分に取り出すことができないではないこと -

さようなら cghersi

+0

実際にデータとキーが必要であるという事実を反映するようにタイトルを変更しました。それ以外の場合は、キーのみのクエリを実行できます。 –

答えて

1

あなたが持っているスケーリングの問題は、あなたがすべてのキーを必要とするということです。どんなシステムを使っていても、これは常に少なくともO(n)になるでしょう。

すべてをプリフェッチするのではなく、作業をバッチで行い、cursorsを使用して次の結果セットを効率的に取得する必要があります。

モデルのフィールドが必要な場合、モデルインスタンス全体を取得する必要があります。モデルインスタンスはシリアル化されたブロブとして保存されるため、1つのフィールドだけを取得する方法はありません。

+0

だから、これは議論の終わりです。ブロブの直列化は、オブジェクトのフィールドのサブセットのみを効率的に取ってしまうのを妨げています...ありがとうございます。 –

0

あなたの質問は2部あります。キーのみを取得する最初の部分では、パラメータkeys_onlyをTrueに設定してクエリを作成するときにキーを返すように指定することができます。 ここをクリックしてください: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query

これは、エンティティ全体を取得していないため、多少役立ちます。しかし、一度に1,000,000件すべてを処理したい場合は、おそらく十分に役立たないでしょう。その場合、ニックのアドバイスを受けて作業を中断してください。

関連する問題