1

GAE データベースのフィールドの更新について質問があります。私の問題は次のようになります。

class A(db.Model):
    a = db.StringProperty()

そしてブールフィールドを追加しました:

class A(db.Model):
    a = db.StringProperty()
    b = db.BooleanProperty(default=False)

今私の問題は、モデル b == False のすべてのインスタンスを持ちたいということです。

それを更新するには、もちろんそれらをデータストアからドラッグしてそこに戻すことができますが、そこにはすでに 700k の要素があり、それを効率的に行う方法が本当にわかりません。ソフトメモリ超過エラーが発生するため、一度に取り出すことができません。小さなチャンクでそれを行おうとすると、多くのデータベース読み取り操作が必要になります。データストアを更新する方法が他にあると思いますか?

乾杯

4

2 に答える 2

2

@ShayErlichmenに同意します。ただし、本当にすべてのエンティティを更新したい場合は、MapReduce ライブラリを使用するのが最も簡単な方法です: http://code.google.com/p/appengine-mapreduce/

ドキュメントがひどいので、思ったほど簡単ではありませんが、これが出発点です: http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython

渡された各エンティティの値をチェックする関数 foo() を書くだけで、必要に応じてブール値の値を更新して書き込みます。

ライブラリはエンティティのバッチを取得し、各バッチを個別のタスクに送信します。各タスクは、関数 foo() を呼び出すループで実行されます。バッチは並行して実行されるため、いくつかのインスタンスを並行して起動する場合がありますが、高速になる傾向があることに注意してください。

于 2012-10-12T21:28:31.740 に答える
1

新しい属性は、None、False、および True の 3 つの状態のいずれかになります。コードで None を False として扱うだけで、更新を行う必要はありません。

于 2012-10-12T21:21:15.667 に答える