Fortran:读取未知大小的文件时如何分配数组?

Fortran: How do I allocate arrays when reading a file of unknown size?

我对 Fortran 的典型使用是从读取未知大小(通常为 5-100MB)的文件开始的。我当前的数组分配方法涉及读取文件两次。首先确定问题的大小(分配数组),然后第二次将数据读入这些数组。

是否有更好的大小 determination/array 分配方法?我刚刚在另一个 post 中阅读了自动数组分配(下面的示例),这似乎更容易。

array = [array,new_data]

所有选项及其优缺点是什么?

尽管问题摇摇欲坠接近 off-topicality,但我会咬一口。您的选择是:

  1. 读取文件一次获取数组大小,分配,再次读取。
  2. 阅读 piece-by-piece,随手(重新)分配。根据需要选择要阅读的文章大小(或者,也许,您认为对您的情况来说可能是最快的)。
  3. 总是,总是,使用包含元数据的文件来告诉感兴趣的程序有多少数据;例如一个块 header 行告诉你下一个有多少数据元素 块。

选项 3 是迄今为止最好的。一点额外的想法,关于一整行代码,在项目开始时,节省了很多浪费的时间和精力。您不必跳上 HDF5 或类似的重量级文件设计方法,只需采用足够的纪律来维持文件内容的使用寿命。对于来自您的宇宙模拟的 iteration-by-iteration 转储,home-brewed 方法就可以了(老实说,您是唯一会查看它们的人)。对于以每 TB 大约 100 万美元的成本收集的数据(卫星观测、海上地震轨迹、),然后是 HDF5 或类似的东西。

选项 1 也可以。您不再需要等待磁带在读取之间倒带。 (好吧,有些确实如此,但如今它们处于小众市场,de-archiving 系统通常会将文件从磁带移动到磁盘(如果要使用的话)。)

选项 2 是个废话。它也可能是性能最差的,但除了最大的文件外,最差的性能可能在最好的 nano-century 之内。如果这对您很重要,请查看。

如果你想量化我的意见运行你自己在你的硬件上的文件上的实验。

PS我真的不知道获取 1TB 的卫星或地震数据要花多少钱,这是为了支持一个论点而发明的事实。

我想补充一下之前的回答: 如果您的数据具有常规结构并且可以在 txt 文件中打开它,请按 ctrl+end substract header 到行总数,它就在那里。虽然如果它很大,你可能会浪费时间打开它。