【问题标题】:MPI locking for sqlite (python)sqlite的MPI锁定(python)
【发布时间】:2014-08-28 11:52:19
【问题描述】:

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

【问题讨论】:

  • FAQ
  • 谢谢,该部分非常清楚地解释了多个进程将无法同时写入数据库。但是,MPI 是否有一种有效的方法允许进程以先到先得的方式轮流写入数据库?这将消除在我的程序中使用 Gather 的需要,并且它将允许首先完成处理的进程能够写入它们的数据,而无需等待较慢的进程完成。

标签: python sqlite locking mpi4py mpi-io


【解决方案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 可以在结果准备好后立即保存。 an mpi4py example 展示了当任务很多且处理时间差异很大时如何将任务分散到多个工作人员身上。

【讨论】:

  • 感谢您的回答,但正如您在问题中看到的那样,我最初的方法是将数据传递回根进程。在这个问题中,我想看看是否有办法通过让每个进程同时写入数据库来避免这种情况。
  • @Harrison,您问,“MPI 是否有一种有效的方法允许进程以先到先得的方式轮流写入数据库?”我建议这样做的方法是让根进程协调对数据库的写入。通过从任何工人那里接收,它将先到先得。唯一的缺点是根进程会空闲,但你可以分配一个额外的工作进程来补偿。
猜你喜欢
  • 2011-02-14
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多