Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何提高HDF5 I/O(写入文件)效率?_Fortran_Hdf5 - Fatal编程技术网

Fortran 如何提高HDF5 I/O(写入文件)效率?

Fortran 如何提高HDF5 I/O(写入文件)效率?,fortran,hdf5,Fortran,Hdf5,我有很多与时间相关的科学数据要写,这意味着数据应该每隔几秒钟写入hdf5文件。我的hdf5文件结构设计如下: 创建多个时间组,如时间1组、时间2组、时间3组等 在时间组中,创建了许多数据集,如DataSetA、DataSetB、DataSetC等 将数据写入上面的数据集 使用的API:HDF5 Fortran 运行此程序,一切正常,但速度较慢,如何提高hdf5写操作效率?非常感谢。似乎您正在为每个时间步将数据分组(我只是根据您所写的猜测)。在所有数据集中添加一个表示时间步长的额外维度并去掉组可能

我有很多与时间相关的科学数据要写,这意味着数据应该每隔几秒钟写入hdf5文件。我的hdf5文件结构设计如下:

  • 创建多个时间组,如时间1组、时间2组、时间3组等
  • 在时间组中,创建了许多数据集,如DataSetA、DataSetB、DataSetC等
  • 将数据写入上面的数据集
  • 使用的API:HDF5 Fortran


    运行此程序,一切正常,但速度较慢,如何提高hdf5写操作效率?非常感谢。

    似乎您正在为每个时间步将数据分组(我只是根据您所写的猜测)。在所有数据集中添加一个表示时间步长的额外维度并去掉组可能更有效,因为可以在每次写入之前将一组迭代缓冲在一起

    以明确的方式,而不是:

    /time-1-group
        /time-1-group/DataSetA -> 2d array
        /time-1-group/DataSetB -> 2d array
        ...
    /time-2-group
        /time-2-group/DataSetA -> 2d array
        /time-2-group/DataSetB -> 2d array
        ...
    ...
    
    你可以这样做:

    /DataSetA -> 3d array where third index is time
    /DataSetB -> 3d array where third index is time
    ...
    

    您必须使用分块数据集并小心选择分块大小以优化I/O效率(正如我上面所说,每个分块可以有多个时间步)。

    速度慢吗?1B/s慢还是10GB/s慢?您得到的文件系统最大写入速率是多少?你们有并行文件系统吗?您的代码是否以任何方式并行?在调用HDF5写例程之前,您的程序以写缓冲的方式做什么?这么多问题,这么少数据…@HighPerformanceMark嗨,我不使用并行API,只使用h5ltmake_dataset_int()API。大多数科学数据都是二维真实数据数组。我倾向于同意@HighPerformanceMark-I/O总是很慢。这个输出比什么慢?HDF5的输出速度比仅仅将数组作为未格式化的fortran二进制文件写入要慢多少?(不是推荐的文件I/O策略,只是简单的基准测试)嗨,Simon。非常感谢您的提示和非常清晰的说明。但我对“因为可以在每次编写之前将一组迭代缓冲在一起,所以可以去掉这些组”感到困惑,您能给我举个例子吗。非常感谢。我举了一个例子,当我说“清楚,…”。现在,在根组(
    /
    )中似乎有组(
    time-1-group
    time-2-group
    ),在每个组中都有数据集(
    DataSetA
    DataSetB
    )。我建议您直接在根组中编写数据集,并为索引为时间步长的每个数据集添加一个维度。要了解缓冲区和块部分,您应该了解hdf5的工作原理,而不仅仅是高级接口。您还需要使用Hyperslab。太好了。好的,非常感谢你,西蒙~@Simon-“HDF5文档很棒”-您的评论可能是这句话第一次出现。