メモリエラーが出てしまうdb操作について

閲覧: 39 回
最初の未読メッセージにスキップ

warao.shikyo

未読、
2011/11/29 19:13:502011/11/29
To: Google-App-Engine-Japan
一つのモデルにプロパティが300くらいあって
複合検索条件を満たすためにインデックスを20程設定したところ
単純に
hoge.gql(u" ORDER BY ID LIMIT 200")
という操作でさえメモリーエラーが出るようになりました
LIMITを150にするとうまく通ります

これをせめて500以上操作できるようにしたいのですが、どの方法が効果的でしょうか?

モデルを分割して検索条件だけのモデルを作成他のデータはReferencePropertyで紐付けする
モデルを分割して検索条件だけのモデルを作成他のデータは自前のIDで紐付けする
インデックスを整理
_key_で検索しあとから順に取り出す
他の方法

データの分割は結果リストを作成する手間を考えると極力避けたいです
またReferencePropertyで紐付けすると検索に成功しても子データにアクセスした瞬間にメモリが一気に増えるのでしょうか?
インデックスの整理だけでどの程度なんとかなるものでしょうか?
試せばわかることではありますが、どの順番で何を試したらいいかくらいの方向性が見えるとありがたいです。
何かアドバイスをお願いいたします。

najeira

未読、
2011/12/01 4:56:082011/12/01
To: Google-App-Engine-Japan
najeiraです。

メモリエラーが出るということは、
Datastoreから返ってきたデータが大きすぎるということですよね。

なので、インデックスは関係なく、おそらく1つのエンティティ(モデルの実体のことです)の
サイズ自体が大きいものと思われます。

よって
・エンティティのサイズ自体を小さくする(分割など)
・一度に少しずつエンティティを処理する
のいずれかの方法を取るしかないと思います。

あるいは、その処理がユーザのアクセスと関係ないバックグラウンドの処理であれば、
メモリの多いBackendを使えば、大丈夫かもしれません。

参考:
http://code.google.com/intl/ja/appengine/docs/python/config/backends.html#Instance_Classes

warao.shikyo

未読、
2011/12/01 19:10:172011/12/01
To: Google-App-Engine-Japan
najeiraさんありがとうございます。
一応の対策としてSELECT _KEY_ FROM hoge WHERE で検索して読み込むエンティティの数をコントロールしながら
一度に少しずつエンティティを処理することになりそうです。
メモリの多いBackendを使えば、大丈夫かもしれないという情報は初めて知りました。
個別処理の他に一括処理が必要なのでその時活かせられるかもしれません。

対策は思いつくものの常識的な手段や裏技的なものを知らないので質問させていただきました。

ありがとうございました。

> 参考:http://code.google.com/intl/ja/appengine/docs/python/config/backends....

najeira

未読、
2011/12/06 5:53:012011/12/06
To: Google-App-Engine-Japan
najeiraです。

まもなくリリースされる1.6.1から、フロント側のインスタンスも
クラスを選べるようになる可能性があります。

そうすると、バックエンドを使わないでも解決できるかもしれません。

全員に返信
投稿者に返信
転送
新着メール 0 件