用 MPI/c++ 修改读取的大 .txt 文件?

Modifying an reading big .txt file with MPI/c++?

我正在将 MPI 与 C++ 一起使用。我想从一个文件中读取信息,按照某种规则对其进行修改,然后将修改后的内容写入同一个文件中。我正在使用临时文件,我在其中存储修改后的内容,最后我用这些命令覆盖它:

temp_file.open("temporary.txt",ios::in);
ofstream output_file(output_name,ios::out);
output_file<<temp_file.rdbuf(); 
output_file.flush();
temp_file.close();
output_file.close();
remove("temporary.txt");

这个修改文件的函数是由0级MPI进程执行的。退出函数后,调用MPI_Barrier(MPI_COMM_WORLD);以确保同步。 然后,所有 MPI 进程都应该读取修改后的文件并执行一些计算。问题是,由于文件太大,函数执行完成后数据没有完全写入文件,我得到了错误的结果。我也尝试过输入 sleep() 命令,但有时有效,有时无效(这取决于我执行计算的节点)。有解决这个问题的通用方法吗? 我把 MPI 作为一个标签,但我认为这个问题本质上与 c++ 标准和存储操作有关。如何处理写入缓冲区a和写入存储介质上的文件之间的延迟?

有趣的话题。您在这里处理两个或三个一致性语义。

POSIX 一致性实质上是指将一个字节写入文件时,它是可见的。

NFS 一致性表示 "woah, that's way too hard. you write to this file and I'll make it visible whenever I feel like it. "

MPI-IO 一致性语义(您没有使用,但很高兴知道)表示数据在特定同步事件发生后可见。这两个事件是 "close a file and reopen it" 或 "sync file, barrier, sync file again"。

如果您正在使用 NFS,请立即放弃。 NFS 太可怕了。您可以使用许多优秀的并行文件系统,其中一些可以完全在用户空间中设置(例如 PVFS)。

如果您在此处使用 MPI-IO,您将获得更明确的行为,但 MPI-IO 例程更像是 C 系统调用而不是 C++ iostream 运算符,因此更像是 open(2) read( 2)写(2)和关闭(2)。文本文件通常很难处理,但在您将修改附加到文件的情况下,这应该不会太糟糕。