Google App Engine上的Django Fixture加载非常慢

时间:2012-08-03 01:03:20

标签: django google-app-engine google-cloud-datastore django-nonrel

我使用Google App Engine部署了一个Django网站,并使用命令

python manage.py remote loaddata my_data.yaml

使用yaml格式的fixture文件中的初始数据填充数据存储区。以下是我的yaml文件示例:

- fields: {team: 10, first_name: Jeff, last_name: Adrien, age: 25, pos: SF, gp: 8, mp: 63, 
fg: 7, fga: 16, ft: 7, fta: 12, three_pointers: 0, threes_attempted: 0, orb: 5, drb: 17, 
ast: 1, stl: 0, blk: 2, tov: 2, pf: 13, pts: 21
}
  model: players.player
  pk: 1
- fields: {team: 7, first_name: Arron, last_name: Afflalo, age: 26, pos: SG, gp: 62, mp: 2086, 
fg: 329, fga: 699, ft: 197, fta: 247, three_pointers: 88, threes_attempted: 221, orb: 40, 
drb: 157, ast: 149, stl: 36, blk: 13, tov: 85, pf: 134, pts: 943
}
  model: players.player
  pk: 2

总yaml文件大约是这个大小的20倍(它转到pk:478)。我认为这不是很大,但即使我有一个非常快的网络连接(1 Mbps),它也需要花费相当长的时间(几分钟)加载到数据存储区。

最重要的是,在加载之后,我检查了Google App Engine上的仪表板,它说我在数据存储上执行了0.04万次写操作。根据我的计算,假设我上面有21个字段,加上pk的一个字段,478个模型实例,我应该只执行大约10K写入,而不是40K。

是否发生了额外的写入,因为我正在使用django-dbindexer为first_name和last_name字段添加索引?如果是这样,那么为什么加载我的数据需要这么长时间?

1 个答案:

答案 0 :(得分:2)

远程API非常慢。如果您阅读旧的google-appengine-python邮件列表(您可以在Google网上论坛中找到它),则会注意到它对于海量数据传输无效。 API最终会为每个读取或写入请求发出HTTP请求。所以这是众所周知的。批量加载器似乎是加载海量数据的方法(我没有亲自尝试过)。

您的写入取决于您拥有的索引属性的数量,而这又取决于您拥有的索引数量。 dbindexer可能正在添加其他索引字段。您应该能够使用数据存储区管理查看数据存储区中的实际实体,以查看它们是否具有dbindexer生成的字段。如果是dbindexer的错,你会看到额外的字段,如“idxf_first_name_iexact”。

更有可能的是,您正在进行一些复杂的查询,这些查询需要为每个实体编写额外的索引。您应该能够查看管理员中的“数据存储区索引”页面,以查看每个实体编写的额外索引的数量。

索引增长速度超过预期的另一种方式是,如果你有一个索引列表属性,但它看起来不像你有。

我建议你对dbindexer持怀疑态度。我没有广泛使用它,但它可以为你做的JOIN操作不能很好地扩展,所以在我看来,它只是一个玩具,而不是一个可用的功能。可能还有一些东西你可以使用它。例如,如果您想进行不区分大小写的搜索,它会自动为您添加“iexact”字段,而不必手动执行。