GAE数据存储区性能与SQLite相比

时间:2012-09-02 15:18:49

标签: python sqlite google-app-engine google-cloud-datastore

我在开发服务器和生产服务器上使用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作业运行查询。

3 个答案:

答案 0 :(得分:2)

您的问题是您逐个插入这些记录

您需要使用批量插入,请参阅https://developers.google.com/appengine/docs/python/tools/uploadingdata

或者您可能想要插入记录列表,如文档中所述:

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

答案 1 :(得分:1)

我没有看到您在任何属性上使用indexed=False的任何证据。每次写入时,每个此类属性将进行两次额外写入(一次用于升序索引,一次用于降序索引)。那些加起来很快。

答案 2 :(得分:0)

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