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

我只有一个索引,关于游戏年份和日期。插入一个包含 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 的数据存储中迁移出来,上面对更大数据集的查询只需要几分之一秒。我的数据只是建模不佳吗?数据存储就这么慢吗?

编辑 1
为了提供更多背景信息,我从用户上传的文件中插入数据。该文件被上传到 blobstore,然后我使用 csv.reader 来解析它。这会定期发生,并且查询是基于 cron 作业运行的。

4

3 回答 3

2

您的问题是您将这些记录一一插入

您需要使用批量插入,请参阅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您的任何财产上使用。每个这样的属性每次写入将需要两次额外的写入(一次用于升序索引,一次用于降序索引)。这些加起来很快。

于 2012-09-03T02:07:45.103 回答
0

您不需要批量加载程序,因为您已经上传了 CSV。但是您可以使用批量插入。请参阅这些提示: http: //googleappengine.blogspot.nl/2009/06/10-things-you-probably-didnt-know-about.html 查找: 5. 您可以批量放置、获取和删除操作以提高效率

于 2012-09-02T16:04:20.043 回答