0

開発サーバーと運用サーバーの両方で GAE データストアを使用すると、ひどいパフォーマンスが見られます。次の単純化されたモデルがあります。

class Team(db.Model):
    name = db.StringProperty()
    # + 1 other property
    # home_games from Game
    # away_games from Game

class Game(db.Model):
    date = db.DateProperty()
    year = db.IntegerProperty()
    home_team = db.ReferenceProperty(Team, collection_name='home_games')
    away_team = db.ReferenceProperty(Team, collection_name='away_games')
    # + 4 other properties
    # results from TeamResults

class TeamResults(db.Model):
    game = db.ReferenceProperty(Game, collection_name='results')
    location = db.StringProperty(choices=('home', 'away'))
    score = db.IntegerProperty()
    # + 17 other properties

ゲームの年と日付のインデックスは 1 つしかありません。478 チームと 786 試合の小さなデータセットを挿入するのに約 50 秒かかりました。簡単なクエリ:

games = Game.all()
games.filter('year = ', 2000)
games.order('date')

for game in games:
    for result in game.results:
        # do something with the result

約45秒かかりました。

私は SQLite ベースのデータ ストレージから移行しようとしていますが、はるかに大きなデータセットに対する上記のクエリはほんの数秒しかかかりません。データのモデル化が不十分なだけですか? Datastore はこれだけ遅いのですか?

編集 1
もう少し背景を説明するために、ユーザーがアップロードしたファイルからデータを挿入しています。ファイルはブロブストアにアップロードされ、csv.reader を使用して解析します。これは定期的に発生し、cron ジョブに基づいてクエリが実行されます。

4

3 に答える 3

2

あなたの問題は、これらのレコードを1つずつ挿入することです

バッチ挿入を使用する必要があります。https: //developers.google.com/appengine/docs/python/tools/uploadingdataを参照してください

または、ドキュメントで説明されているように、レコードのリストを挿入することもできます。

https://developers.google.com/appengine/docs/python/datastore/entities#Batch_Operations

于 2012-09-02T15:26:27.807 に答える
1

indexed=Falseあなたがあなたの財産のいずれかで使用しているという証拠はありません。このような各プロパティは、書き込みごとに 2 つの追加の書き込み (昇順のインデックス用に 1 つ、降順のインデックス用に 1 つ) を必要とします。それらはすぐに合計されます。

于 2012-09-03T02:07:45.103 に答える
0

すでに CSV をアップロードしているため、一括ローダーは必要ありません。ただし、バッチ挿入を使用できます。次のヒントを参照して ください: http://googleappengine.blogspot.nl/2009/06/10-things-you-probably-didnt-know-about.html

于 2012-09-02T16:04:20.043 に答える