所以我想使用python驱动程序批量插入文档到Couchbase。但是,如果批处理超过几千个文件,python内核将重新启动(我正在使用笔记本)。
要重现这一点,请尝试:
from couchbase.bucket import Bucket
cb = Bucket('couchbase://localhost/default')
keys_per_doc = 50
doc_count = 10000
docs = [dict(
[
('very_long_feature_{}'.format(i), float(i) if i % 2 == 0 else i)
for i in xrange(keys_per_doc)
] + [('id', id_)] ) for id_ in xrange(doc_count)]
def sframe_to_cb(sf, key_column, key_prefix):
pipe = cb.pipeline()
with pipe:
for r in sf:
cb.upsert(key_prefix + str(r[key_column]), r)
return 0
p = sframe_to_cb(docs, 'id', 'test_')
有趣的是,所有文档都会被插入,我认为解释器在管道上收集结果时会死亡。退出方法。
我没有收到任何错误消息,而且笔记本控制台只是说已经重新启动了笔记本。
我很好奇导致此行为的原因以及是否有办法解决此问题。
显然我可以进行小批量处理(在我的情况下最多可以有3000个文档)但如果按顺序处理它会使速度慢得多。
我无法使用多处理,因为我在芹菜中运行插入。
我不能使用多个芹菜任务,因为批次的序列化太昂贵并且可能会杀死我们的redis实例。
所以问题:
大批量导致崩溃的原因是什么?有办法解决吗? 假设upserts没有任何问题可以让管道丢弃结果。 是否有不同的方法可以从单个流程实现高吞吐量?
评论中要求的其他信息: