Python Couchbase管道()以大批量杀死解释器

时间:2015-09-01 16:43:10

标签: python performance batch-processing couchbase throughput

所以我想使用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没有任何问题可以让管道丢弃结果。 是否有不同的方法可以从单个流程实现高吞吐量?

评论中要求的其他信息:

  • 运行Ubuntu 14.04 LTS VM的Mac上的VMWarte fusion
  • 来宾ubuntu有4GB内存,12GB交换SSD,2个内核(4个线程)
  • 做小批量生产较慢的印象来自观察铲斗的统计数据(10K TPS较小的批量高峰获得了大约2K TPS)
  • 如果我使用多处理并且这些批次分布在多个CPU(20-30K TPS)上有很大的加速,但由于芹菜限制我不能在生产中这样做(我不能在芹菜任务中使用ProcessPoolExecutor)< / LI>
  • 我无法确定崩溃究竟何时发生(我不确定这是否相关)

0 个答案:

没有答案