如何将multiprocessor.manager.list转换为纯python列表

时间:2013-12-18 17:33:06

标签: python python-3.x sqlalchemy multiprocessing

我的正常脚本在20秒内完成了大约30,000条记录。鉴于我必须运行的数据量(超过5000万条记录),我认为使用python的多处理是明智的。

在我的流程结束时,我使用sqlalchemy核心进行数据库更新,我以50,000个批量更新处理过的记录。 SQLAlchemy Core requires that you pass it a list for it to do a bulk update or even insert。我将此列表称为py_list

对于Python的多处理,我将通过multiprocessing.manager.list()捕获流程的结果,我将称之为mp_list

一切正常,直到我将mp_list传递给SQLAlchemy批量更新语句。这失败并显示错误AttributeError: 'list' object has no attribute 'keys'。谷歌搜索带我到question on SO,它表明multiprocessing.manager.list()甚至multiprocessing.manager.dict()不是真正的python列表/字典。

问题是,如何将multiprocessing.manager.list转换为真正的python列表。

mp_list填充如下:

import multiprocessing
manager = multiprocessing.Manager()
mp_list = manager.list()

def populate_mp_list(pid, is_processed):
    '''Mark the record as having been processed'''
    dict = {}
    dict['b_id'] = pid
    dict['is_processed'] = is_processed
    mp_list.append(dict)

抛出错误的SQLALchemy代码如下:

CONN = Engine.connect()
trans = CONN.begin()
stmt = mytable.update().where(mytable.c.id == bindparam('b_id')).\
values(is_processed=bindparam('is_processed'))
CONN.execute(stmt, mp_list)
trans.commit(

我尝试将mp_list转换为真正的python列表。创建的新列表有效,但其创建的时间代价否定了多处理中保存的所有时间。

如果我循环返回mp_list并创建一个新列表。

y = []
for x in mp_list:
    y.append(x)

另外,如果我对mp_list进行“复制”,每个副本增加3秒!罚款平均而言并不酷。

y = mp_list[0:len(mp_list)]

那么,这是将multiprocessing.manager.list转换为SQLAlchemy Core可用的列表的最快方法吗?

3 个答案:

答案 0 :(得分:2)

表现如何:

y = [x代表mp_list中的x]

答案 1 :(得分:1)

希望我不迟到。

这行不通吗?

pythonlist = list(mp_list)

同样的东西也适用于字典:-

pythondict = dict(mp_dict)

答案 2 :(得分:-1)

使用列表即可轻松解决问题。

result_list = list(proxy_list)