首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >redis:使用joblib批量插入

redis:使用joblib批量插入
EN

Stack Overflow用户
提问于 2020-01-22 19:22:45
回答 1查看 101关注 0票数 1

我有一份记录清单。对于我的每一条记录,我需要进行一些繁重的计算,因为我在redis中创建了一个反向索引。对于reach记录,在一个管道中执行多个redis命令(100个sadd +1 set)。

我想并行化这个索引创建部分(使用joblib),但失败了。第一个问题是,我想将redis连接传递给每个作业,但这并不起作用,因为joblib想要序列化它,这是不起作用的。因此,只需提交主机/端口并让每个进程创建自己的连接即可。

代码语言:javascript
复制
def heavy_calc_insert(value, host, port)

    r = redis.Redis(host=host, port=port)

    #... some calc

    pipe = r.pipeline()

    for bit in bits:
        key = "bit:" + str(bit)
        pipe.sadd(key, idx_value)

    pipe.set(idx_value, id)
    pipe.execute()

Parallel(n_jobs=4)(delayed(heavy_calc_insert)(value, host, port) for value in values)

但是,通过这段代码,我很快就得到了一个ConnectionError

代码语言:javascript
复制
ConnectionError: Connection closed by server.

我想我遇到了有太多连接的一种形式。

我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2020-01-22 21:25:04

使用连接池。https://github.com/andymccurdy/redis-py/blob/master/README.rst#connection-pools

在heavy_calc_insert之外创建池,并传递池而不是主机和端口。

代码语言:javascript
复制
pool = redis.ConnectionPool(host=host, port=port, db=0)
...
def heavy_calc_insert(value, pool)
    r = redis.Redis(connection_pool=pool)
    ...

Redis有默认的10,000个连接限制,并且它不会关闭未使用的连接。

连接池将控制创建的连接,并为您提供更好的性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59858617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档