我们正在从生产数据库迁移一些数据,并希望将大部分数据存档在Cloud Datastore中。
最终我们会将所有数据移到那里,但最初将重点放在存档数据上作为测试。
我们选择的语言是Python,并且能够逐行地将数据从mysql传输到数据存储区。
我们有大约1.2亿行要传输,一次一行的方法需要很长时间。
有没有人找到一些关于如何使用python将数据批量插入云数据存储区的文档或示例?
任何评论,建议表示赞赏,谢谢。高级。
答案 0 :(得分:7)
我今天所知道的云数据存储没有“批量加载”功能,所以如果您期望“上传包含所有数据的文件并且它将出现在数据存储中”,我就不会以为你会找到任何东西。
您总是可以使用并行化工作的本地队列编写快速脚本。
基本要点是:
数据存储是可大规模并行化的,因此如果您可以编写一个每秒发送数千个写入的脚本,它应该可以正常工作。此外,这里的大瓶颈将是网络IO(在发送请求之后,您必须等待一段时间才能获得响应),因此许多线程应该获得相当不错的整体写入速率。但是,您应该确保在这些线程之间适当地分配工作。
现在,您应该调查Cloud Datastore是否适合您的数据和持久性/可用性需求。如果您正在占用120万行并将其加载到Cloud Datastore中以进行键值样式查询(也就是说,您有key
和未编入索引的value
属性,这只是JSON数据),那么这可能会使感觉,但在这种情况下加载你的数据将花费你〜$ 70(120m * $ 0.06 / 100k)。
如果您拥有属性(默认情况下将被编入索引),则此成本会大幅上升。
操作成本为每100k 0.06美元,但单个“写入”可能包含多个“操作”。例如,假设您在一个包含5列的表中有120米的行(相当于一个具有5个属性的类)。
单个“新实体写入”相当于:
因此加载此数据的实际成本为:
120m实体* 12 ops / entity *($ 0.06 / 100k ops)= $ 864.00
答案 1 :(得分:0)
我相信你要找的是put_multi()
方法。
从docs,您可以使用put_multi()
批量处理多个放置操作。这将导致批处理的单个RPC而不是每个实体的一个RPC。
示例:
# a list of many entities
user_entities = [ UserEntity(name='user %s' % i) for i in xrange(10000)]
users_keys = ndb.put_multi(user_entities) # keys are in same order as user_entities
另外需要注意的是,docs是:
注意:ndb库会自动批量调用大多数Cloud Datoreore,因此在大多数情况下,您不需要使用下面显示的显式批处理操作。
尽管如此,您仍然可以使用任务队列(我更喜欢deferred
库),以便在后台批量处理大量数据。
答案 2 :(得分:0)
作为@JJ Geewax答案的更新,截至2016年7月1日 读写操作的费用已更改,如下所示:https://cloud.google.com/blog/products/gcp/google-cloud-datastore-simplifies-pricing-cuts-cost-dramatically-for-most-use-cases
因此,对于上述情况,写作本应便宜一些,
写一个实体,无论索引如何,只需花费1次写操作,现在每100,000个花费$ 0.18