【问题标题】:Reading data from a large file从大文件中读取数据
【发布时间】:2018-07-06 21:23:54
【问题描述】:

我有一个如下的文本文件。

0.031 0.031 0.031 1.4998 0.9976 0.5668 0.9659

0.062 0.031 0.031 0.9620 0.7479 0.3674 0.4806 

等等……

这是一个 32^3 的网格,这意味着将有 32768 行。每行有 7 列。我需要读取每一列并将其存储在单独的一维数组中。

Fortran 代码看起来像

open(unit=1,file='32data.txt') ! that's the filename
do i= 1,32767
read(1,*) x(i),y(i),z(i),norm(i),xv(i),yv(i),zv(i)
end do

我想知道当给出比这更大的文件时(比如 512^3)在 MPI 中并行化它。我需要一次读取部分数据并工作(以最大程度地减少工作量,并且主工作者将没有足够的本地内存)。

如何开始一次发送几条数据?

【问题讨论】:

  • 我会先将文件分解成更小的文件。例如,512 个 512^2 行的文件。以sed 为例。但是,这种分解本身可能无法并行化。
  • 欢迎使用 StackOverflow,请务必使用 tour 并阅读 How to Ask。避免不必要的噪音,如“帮助我”或“提前致谢”,不要将问题标记为“- FORTRAN”,这些标签就是为了这个。
  • 在滑动窗口中阅读会有所帮助。但是创建这么多行的 512 个文件会太耗时吗?有没有更简单的方法可以让每个处理器只读取部分数据,然后在以后全局组合?
  • @VladimirF 将编辑它。谢谢!
  • 文本文件不适合并行 I/O。每个等级一个文件,或二进制数据 + MPI-IO 是推荐的方式。如果没有,让所有任务读取文本文件并跳过一些行可能是一个较小的邪恶。

标签: parallel-processing fortran mpi hpc


【解决方案1】:

通常,并行程序的输入/输出部分不是并行的。

norio 建议提前拆分文件。这种预处理不会是并行的。如果您的节点有自己的文件系统,这是有利的。如果您的集群有一个共享文件系统,那么所有节点都会在启动时争夺文件访问权限。

选项 2:当 master 读取文件时,它会分发数据并忘记数据,这样它就不会耗尽内存。

选项 3:每个节点扫描整个文件,忽略未分配给它的行。

【讨论】:

  • 选项 2 正是我想要的。但是说到这里,根进程会读取整个文件以拆分数据,对吗?它是否有足够的本地内存来存储它?
  • 假设您有 10 个节点。读入1/10的数据后,主节点将其发送到适当的节点并忘记数据。 (为接下来 1/10 的数据解除分配或只使用相同的数据结构)
  • 感谢您的回复,这听起来很吸引人。有什么可以参考的例子吗?
  • IO 可以很容易地并行,使用 MPI-IO。如果文件系统是共享和并行的,那就更好更快了。
  • 我绝对不建议master分块读取数据并发送。
猜你喜欢
  • 2012-01-28
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多