1

我在 Mac os x (10.7) 上遇到了 HDF5 的一些问题。经过一些测试,我确认 POSIX 写入似乎存在缓冲区大小超过 2gb 的问题。我编写了一个测试程序来演示这个问题:

#define _FILE_OFFSET_BITS 64

#include <iostream>
#include <unistd.h>
#include <fcntl.h>


void writePosix(const int64_t arraySize, const char* name) {
    int fd = open(name, O_WRONLY | O_CREAT);

    if (fd != -1) {

        double *array = new double [arraySize];

        double start = 0.0;
        for (int64_t i=0;i<arraySize;++i) {
            array[i] = start;
            start += 0.001;
        }


        ssize_t result = write(fd, array, (int64_t)(sizeof(double))*arraySize);

        printf("results for array size %lld = %ld\n", arraySize, result);

        close(fd);
    } else {
        printf("file error");
    }
}


int main(int argc, char *argv[]) {
    writePosix(268435455, "/Users/tpav/testfolder/lessthan2gb");
    writePosix(268435456, "/Users/tpav/testfolder/equal2gb");
} 

输出:

results for array size 268435455 = 2147483640
results for array size 268435456 = -1

如您所见,我什至尝试定义文件偏移量。对此我有什么可以做的,还是我应该开始寻找一种解决方法,以编写 2gb+ 块的方式?

4

1 回答 1

1

在 HDF5 虚拟文件驱动程序中,我们将太大而无法调用的 I/O 操作分解为多个较小的 I/O 调用。POSIX I/O 的 Mac 实现采用 size_t 参数,因此我们的代码假定最大 I/O 大小将是可以放入 ssize_t 类型的变量(读/写的返回类型)中的最大值。可悲的是,事实并非如此。

请注意,这仅适用于单个 I/O 操作。您可以创建超过 2GB/4GB 障碍的文件,只是不能在一次调用中写入 >2GB。

这应该在 HDF5 1.8.10 补丁 1 中修复,该补丁将于 2013 年 1 月下旬发布。

于 2012-10-30T14:43:53.347 回答