0

我已经使用 Google App Engine 部署了一个 Django 网站,并且正在使用命令

python manage.py remote loaddata my_data.yaml

使用来自 yaml 格式的夹具文件的初始数据填充数据存储。这是我的 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 上的仪表板,它说我已经对数据存储执行了 04 万次写入操作。根据我的计算,鉴于上面有 21 个字段,加上 1 个用于 pk,乘以 478 个模型实例,我应该只执行大约 10K 写入,而不是 40K。

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

4

1 回答 1

2

远程 API 真的很慢。如果您阅读旧的 google-appengine-python 邮件列表(您可以在 Google Groups 中找到它),就会发现它对于大量数据传输没有用处。API 最终会为每个读取或写入请求发出 HTTP 请求。所以这是众所周知的。bulkloader 似乎是加载海量数据的方式(我没有亲自尝试过)。

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

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

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

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

于 2012-08-03T05:19:16.717 回答