4

メモリの使用量が多すぎるためにプログラムがクラッシュしたことがあります。これは HDF5 1.8.9 です。

ほとんどの場合、問題はありませんが、大きなファイルでは次のようなことが起こることがあります。

この例では、325MB の HDF5 ファイルがあり、その値の一部を読み取るために2GBのメモリが使用されます (HDF5 ファイルのデータ ポイントの「タイムステップ」、ちょうど 400,001 の倍精度値)。メソッドH5Dreadの使用が問題を引き起こしているようです。ここで何が間違っているのか、何か考えはありますか?

問題を引き起こしているメソッドは次のようになります。

std::vector<double> Hdf5DataReader::GetUnlimitedDimensionValues() 
{ 
    // Define hyperslab in the dataset 
    hid_t time_dataspace = H5Dget_space(mUnlimitedDatasetId); 

    // Get the dataset/dataspace dimensions
    hsize_t num_timesteps;
    H5Sget_simple_extent_dims(time_dataspace, &num_timesteps, NULL);

    // Data buffer to return 
    std::cout << "Number of timesteps we are reserving memory for = " << num_timesteps << "\n"; 
    std::vector<double> ret(num_timesteps);         

    PrintMemoryUsage("made memory space"); 

    // Read data from hyperslab in the file into the hyperslab in memory 
    H5Dread(mUnlimitedDatasetId, 
            H5T_NATIVE_DOUBLE, 
            H5S_ALL, 
            H5S_ALL, 
            H5P_DEFAULT, 
            &ret[0]); 

    PrintMemoryUsage("read into memory space"); 

    H5Sclose(time_dataspace); 

    return ret; 
} 

そして出力は

Number of timesteps we are reserving memory for = 400001
made memory space: memory use = 43.5898 MB.
read into memory space: memory use = 2182.4 MB.

(このコードを使用して、プログラムに割り当てられたメモリの量を診断します - これは賢明に見えますか?:

#include <unistd.h>
#include <sys/resource.h>

void PrintMemoryUsage(const std::string& rPrefix)
{
    struct rusage rusage;
    getrusage( RUSAGE_SELF, &rusage );

    double max_res = (double)(rusage.ru_maxrss)/(1024);// Convert KB to MB
    std::cout << rPrefix << ": memory use = " << max_res <<  " MB.\n";
}

)

4

2 に答える 2

1

私は同じ問題に遭遇しました。私の場合、それはデータセットの無制限の次元が原因でした (Yossarian が述べたように)。

エラーを確認するために、データセットの 2 つのバージョンを作成しました。1 つは次元の長さが無制限で、もう 1 つは次元の長さが固定です。両方のデータセットに同じデータがありました。無制限ではメモリ消費量が急増しましたが、一定の長さで作成されたデータセットには問題はありませんでした。

もう1つ言及する必要があります。元のデータセットは古いバージョンのNetCDFで作成されたもので、「nccopy -k 4」を使用してNetCDF4/HDF5形式に変換しました。

于 2013-09-15T23:33:29.257 に答える
1

Yossarian のコメントには手がかりが含まれていました。メイン データ セットのチャンクを確認しましたが、メモリ爆発は実際には、時間値のみを含む関連する 1D データセットから発生しました。後者のデータセットのチャンク サイズは 1 でした。チャンク サイズを大きくすると、問題が解決しました。

于 2013-10-24T14:54:46.940 に答える