1

Mac os x (10.7) で HDF5 に問題があります。いくつかのテストの後、POSIX 書き込みに 2 GB を超えるバッファー サイズで問題があるように見えることを確認しました。この問題を実証するためのテスト プログラムを作成しました。

#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

ご覧のとおり、ファイル オフセットの定義も試みました。これについて何かできることはありますか、それとも 2 GB 以上のチャンクを書き込む方法で回避策を探し始める必要がありますか?

4

1 に答える 1

1

HDF5 仮想ファイル ドライバーでは、呼び出しには大きすぎる I/O 操作を複数の小さな I/O 呼び出しに分割します。POSIX I/O の Mac 実装は size_t 引数を取るため、コードでは、最大 I/O サイズが ssize_t 型 (読み取り/書き込みの戻り値の型) の変数に収まる最大値であると想定しています。残念ながら、そうではありません。

これは、単一の I/O 操作にのみ適用されることに注意してください。2GB/4GB バリアを超えるファイルを作成できますが、1 回の呼び出しで 2GB を超える書き込みはできません。

これは、2013 年 1 月下旬にリリース予定の HDF5 1.8.10 パッチ 1 で修正される予定です。

于 2012-10-30T14:43:53.347 に答える