2

我正在将 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 执行此操作的信息。

4

1 回答 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

与收集相比的优势在于 rank 0 可以在结果准备好后立即保存。有一个 mpi4py 示例,它展示了当任务很多且处理时间差异很大时,如何将任务分散到多个工作人员身上。

于 2014-12-09T22:17:16.460 回答