gpt4 book ai didi

database - MPI如何发送和接收SQLite数据库

转载 作者:搜寻专家 更新时间:2023-10-30 23:40:05 24 4
gpt4 key购买 nike

我有一个很大的SQLite数据库要处理,所以我想使用MPI进行并行化以加快速度。我想要做的是将一个数据库从 root 发送到每个 slave,并在 slave 添加一些表后将修改后的数据库发送到 root。我想用MPI_Type_create_struct 创建一个数据类型来存储数据库,但是数据库太复杂了。还有其他方法可以处理这种情况吗?先感谢您!

最佳答案

我最近处理了一个类似的问题 - 我有一个使用 SQLite 作为配置存储的大型 MPI 应用程序。使用嵌入式 SQL 数据库处理多进程写入是一项挑战。我的经验涉及使用共享文件系统的大规模并行应用程序(运行多达 65,535 个队列)。

基于FAQ根据 SQLite 和一些数据库引擎的经验,有几种方法可以解决这个问题。我假设您正在使用共享的分布式文件系统和多台独立的计算机(标准 HPC 集群设置)进行操作。

由于 SQLite 在多个进程写入数据库(但不读取)时会阻塞,因此读取很可能不是问题。每个进程都可以同时运行多个 SELECT 命令而不会出现问题。

挑战在于写作。磁盘 I/O 比计算慢几个数量级,所以通常这将是瓶颈。话虽如此,网络通信也可能会显着变慢,因此您如何处理这个问题实际上取决于您的运行环境中最薄弱的环节在哪里。

如果您的网络速度很快但磁盘速度很慢,或者如果您想以最直接的方式实现这一点,最好的办法是让一个单个 MPI rank 负责写入数据库。您的计算进程将独立运行 SELECT 命令,直到计算完成,然后将新数据发送到 MPI 数据库进程。然后数据库控制进程将新数据写入磁盘。我不会尝试通过网络发送数据库的结构,而是发送应该写入的数据,以及(可能)标识应该写入数据的表/插入查询的标志。这种技术有点类似于 RDBMS 的工作方式 - 虽然 RDBMS 服务器确实支持并发写入,但有一个“中央”进程控制写入操作的顺序。

需要注意的一件事是,如果一个进程写入 SQLite 数据库,文件将被锁定,所有 试图读取或写入它的进程。您将需要在您的工作进程中处理 SQLITE_BUSY 返回码,注册一个回调来处理这个,改变繁忙的行为,或者使用替代技术。在我的应用程序中,我发现将数据库加载为内存数据库 ( https://www.sqlite.org/inmemorydb.html ) 为读者提供了一个很好的解决方法。读者访问内存数据库,但将结果发送到控制进程进行写入。缺点是您将在内存中拥有多个数据库副本。

另一个网络密集度较低的选项是并发读取并让每个工作进程写出到他们自己的文件中。您可以写出单独的 SQLite 数据库文件,甚至可以导出 CSV 之类的文件(取决于数据的复杂性)。写入完成后,您将使用一个进程将各个文件合并到一个结果数据库文件中 - 请参阅 How can I merge many SQLite databases? .此方法有其自身的问题,但根据您的瓶颈所在以及整个系统的布局方式,此技术可能会奏效。

最后,您可以考虑从 SQLite 数据库中读取数据并将数据保存为适当的分布式文件格式,例如 HDF5(或使用 MPI IO)。计算完成后,编写脚本从这种外部文件格式创建新的 SQLite 数据库将非常简单。

关于database - MPI如何发送和接收SQLite数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36063757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com