メモリの使用量が多すぎるためにプログラムがクラッシュしたことがあります。これは 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";
}
)