python的并发写访问+;使用多处理的sqlalchemy sqlite数据库

python的并发写访问+;使用多处理的sqlalchemy sqlite数据库,python,pandas,sqlite,sqlalchemy,Python,Pandas,Sqlite,Sqlalchemy,我有一些代码需要很长时间(大约15分钟/循环x 30个循环)才能运行。此外,每个循环都会产生大量数据,写入磁盘也需要一些时间。总之,如果以串行方式运行,这可能需要几个小时。我希望使用多处理模块来加快这一速度 到目前为止,我已经将计算成本高昂的部分并行化了,但在将内容写入磁盘时,仍然存在一个相当大的瓶颈,因为所有这些都必须收敛到主线程,最终的总数超过几百万个条目。为此,我试图找出是否可以执行每个多进程任务的写操作来加快速度 每个循环创建多个输出output1,output2,依此类推,并希望将其数

我有一些代码需要很长时间(大约15分钟/循环x 30个循环)才能运行。此外,每个循环都会产生大量数据,写入磁盘也需要一些时间。总之,如果以串行方式运行,这可能需要几个小时。我希望使用
多处理
模块来加快这一速度

到目前为止,我已经将计算成本高昂的部分并行化了,但在将内容写入磁盘时,仍然存在一个相当大的瓶颈,因为所有这些都必须收敛到主线程,最终的总数超过几百万个条目。为此,我试图找出是否可以执行每个
多进程任务的写操作来加快速度

每个循环创建多个输出
output1
output2
,依此类推,并希望将其数据写入一组特定(已知)的数据库。即-
output1->db1
output2->db2
。对于每个循环,这些数据库都是相同的,数据只是附加到已经存在的数据中。数据也都有用于查询的唯一索引,因此顺序并不重要

由于我在实际数据分析中使用了
pandas
,我一直在使用它的方法来存储这些
DataFrame
s
to_hdf
在串行情况下工作,但不支持并行写入(显然可能存在一些损坏问题),但我相信
to_sql
可以。不幸的是,我还没有弄清楚如何在每个进程中创建到数据库的连接(我正在使用
sqlalchemy
),以确保并发写入是安全的

我尝试了各种方法来尝试在线程之间传递对象,但我似乎总是会遇到错误,例如在通过
mp.Queue
传递对象时,
Synchronized对象只能通过继承在进程之间共享(比如
sqlalchemy.scoped\u session
),或者当尝试将本地对象作为函数参数传递时,
无法pickle\u thread.\u local objects

我是不是找错人了?还是我遗漏了一些明显的东西

我用来尝试的“测试用例”如下所示:

将多处理导入为mp
将numpy作为np导入
作为pd进口熊猫
将sqlalchemy作为sql导入
def sqltest(num):
打印(“来自线程{0}的Hello”。格式(mp.current_process().name))
数据=np.random.random((1000000,4))*num
asDF=pd.DataFrame(数据,索引=np.linspace(num,num+0.991000000))
#需要在这里写入磁盘吗
一无所获
def func_回调(c):
打印(“获取完成回调{0}”。格式(c))
def err_回调(c):
打印(“获取错误回调{0}”。格式(c))
def main():
nums=范围(0,10)
sqldb=sql.create_引擎(“sqlite:///test.db")
将mp.Pool()作为p:
对于范围(0,10)内的i:
p、 apply_async(sqltest,callback=func_callback,error_callback=err_callback,args=(i,))
p、 关闭()
p、 加入
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

此答案表明默认情况下未启用对SQLite数据库的并发写入,您需要使用SQLite启用WAL,一次只有一个到数据库的连接可以保存大量写入,WAL与否。如果需要多个同时写入程序,则需要另一个数据库。