Python中SQLite的MPI锁定

2 投票
1 回答
729 浏览
提问于 2025-04-18 12:25

我正在用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实现这个的资料。

1 个回答

1

我建议你把结果传回到主进程,然后让主进程把这些结果写入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的进程可以在结果准备好后立即保存它们。这里有一个mpi4py的示例,展示了当任务很多且处理时间差异很大时,如何把任务分配给多个工作进程。

撰写回答