用MPI / c ++修改一个大的.text文件?

时间:2015-03-13 12:58:18

标签: c++ file mpi

我正在使用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");

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

1 个答案:

答案 0 :(得分:1)

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

POSIX一致性基本上表示当一个字节写入文件时,它是可见的。

NFS一致性说“哇,这太难了。你写这个文件,我会在任何时候让它看得见。”

MPI-IO一致性语义(您没有使用,但很高兴知道)表示在发生特定同步事件后数据是可见的。这两个事件是“关闭文件并重新打开”或“再次同步文件,屏障,同步文件”。

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

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