gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:22:58 26 4
gpt4 key购买 nike

我正在将 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 一致性说“哇,这太难了。你写入这个文件,我会在我想要的时候让它可见。”

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

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

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

关于c++ - 使用 MPI/c++ 修改读取的大 .txt 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29032877/

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