Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Couchbase pipeline()以大批量杀死解释器_Python_Performance_Batch Processing_Couchbase_Throughput - Fatal编程技术网

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

Python Couchbase pipeline()以大批量杀死解释器,python,performance,batch-processing,couchbase,throughput,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

所以我想使用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_')
有趣的是,所有文档都被插入,我想解释器在管道上收集结果时会死掉。exit方法

我没有收到任何错误消息,笔记本电脑控制台只是说它已重新启动笔记本电脑

我很好奇是什么导致了这种行为,以及是否有办法解决它

显然,我可以进行小批量处理(在我的例子中,最多3000个文档),但如果按顺序处理,则速度会慢得多

我不能使用多重处理,因为我在芹菜内部运行插入

我不能使用多个芹菜任务,因为批量序列化太昂贵,可能会杀死我们的redis实例

因此,问题是:

是什么导致了大批量的崩溃,有没有办法解决? 假设upserts不会出错,我可以让管道丢弃结果。 是否有不同的方法从单个流程实现高吞吐量

评论中要求的其他信息:

  • Mac上运行Ubuntu14.04 LTS虚拟机的VMWarte fusion
  • 来宾ubuntu有4GB RAM,12GB SSD交换,2核(4线程)
  • 小批量生产速度较慢的印象来自于观察桶静态(大批量峰值为10K TPS,小批量峰值为约2K TPS)
  • 如果我使用多处理,并且这些批处理分布在多个CPU(20-30K TPS)上,速度会大大提高,但是由于芹菜的限制,我不能在生产中这样做(我不能在芹菜任务中使用ProcessPoolExecutor)
  • 我真的不知道什么时候会发生坠机(我不确定这是否相关)

您没有说明您的笔记本电脑正在运行什么操作系统,您的笔记本电脑有多少物理内存,重新启动时有多少内存可用,如果重新启动总是发生在(比如)3009项上,您是否检查了这些因素中的任何一个?通常建议将管道限制在几兆字节(2-3M)以内。
管道
功能主要是为了方便而不是
*multi()
方法,因为管道中可以组合多个操作,而
只允许给定类型的单个操作。我很好奇为什么你会觉得如果你减少了一个批次的大小,那么它就慢了。相反,一旦达到一个阈值,你所做的就是简单地推动你的本地RAMPerhaps,你也应该考虑类似G事件或扭曲的东西。或者Ubuntu的虚拟内存?或者两者都有?12G交换4G RAM将事情扩展到了极限,尽管随着内存需求增长超过4G,使用SSD可能会让事情工作一段时间——随着内存使用量的增长,这种过度使用的程度可能会给事情带来很大压力。我怀疑您需要一个更强大的虚拟(可能还有物理)系统来运行此功能。