Skip to main content
 首页 » 编程设计

python之sqlite (python) 的 MPI 锁定

2025年05月04日40oomusou

我正在为我想要并行化的项目使用 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 

这将大大提高我的程序的性能。但是,我不完全确定如何实现这一点。我试图通过谷歌找到方法,但我唯一能找到的是 MPI-IO。是否可以使用 MPI-IO 写入数据库?具体使用 python、sqlite 和 mpi4py。如果没有,是否有任何替代方法可以同时写入 sqlite 数据库?

编辑:

正如@CL 在评论中指出的那样,sqlite3 不支持并发写入数据库。所以让我以不同的方式问我的问题:有没有一种方法可以锁定对数据库的写入,以便其他进程在写入之前等到锁定被删除?我知道 sqlite3 有自己的锁定模式,但这些模式似乎会导致插入失败而不是阻塞。我知道我在 Python 线程中看到过类似的东西,但我无法在网上找到任何关于使用 MPI 执行此操作的信息。

请您参考如下方法:

我建议您将结果传回根进程,然后让根进程将它们写入 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可以在结果准备好后立即保存。有 an mpi4py example这展示了当任务很多且处理时间差异很大时如何将任务分配给多个工作人员。