我正在为一个我想要并行化的项目使用mpi4py。下面是我的程序的非常基本的伪代码:
Load list of data from sqlite database
Based on COMM.Rank and Comm.Size, select chunk of data to process
Process data...
use MPI.Gather to pass all of the results back to root
if root:
iterate through results and save to sqlite database
我想通过简单地让每个进程将自己的结果写入数据库来消除对MPI.Gather的调用。所以我想让我的伪代码看起来像这样:
Load list of data
Select chunk of data
Process data
Save results
这将极大地提高我的程序的性能。然而,我并不完全确定如何做到这一点。我试图通过google查找方法,但我唯一能找到的就是MPI-IO。是否可以使用MPI-IO写入数据库?特别是使用python、sqlite和mpi4py。如果不是,是否有其他并发写入sqlite数据库的方法?
编辑:
正如@CL在评论中指出的那样,sqlite3不支持对数据库的并发写入。所以让我以不同的方式问一下我的问题:有没有一种方法可以锁定对数据库的写操作,以便其他进程等到锁被移除后再进行写操作?我知道sqlite3有自己的锁定模式,但这些模式似乎会导致插入失败而不是阻塞。我知道我在Python线程中见过这样的东西,但我还没有在网上找到任何关于使用MPI做这件事的东西。
发布于 2014-12-10 06:17:16
我建议您将结果传递回根进程,并让根进程将它们写入SQLite数据库。伪代码如下所示:
load list of data
if rank == 0:
for _ in len(data):
result = receive from any worker
save result
else:
select chunk of data
process data
send result(s) to rank 0
与聚集相比,0的优势在于,一旦结果准备就绪,等级0就可以保存它们。有一个an mpi4py example,它展示了当有许多任务并且处理时间差异很大时,如何将任务分散到多个工作进程中。
https://stackoverflow.com/questions/24620065
复制相似问题