HDF5 H5Dread内存使用过多
Excessive Memory use with HDF5 H5Dread
我们的程序因使用过多内存而崩溃。这是HDF5 1.8.9。
大多数时候,我们没有问题,但有时对于较大的文件,会发生以下情况:
在这个例子中,我有一个325MB的HDF5文件,这导致2GB的内存被用来读取它的一些值(HDF5文件中数据点的"时间步长",只有400001个双精度值)。看来是我们使用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";
}
)
Yossarian的评论包含了线索——虽然我们检查了主数据集的分块,但内存爆炸实际上来自一个只包含时间值的关联1D数据集。后一个数据集的块大小为1。增加区块大小解决了问题。
我也遇到了同样的问题。在我的案例中,这是因为数据集的维度是无限的(正如Yossarian所提到的)。
为了验证错误,我创建了两个版本的数据集:一个是无限维度长度,另一个是固定维度长度。这两个数据集都有相同的数据。内存消耗随着无限量的增加而激增,而使用恒定长度创建的数据集则没有任何问题。
还有一件事要提:我的原始数据集是由旧版本的NetCDF创建的,我使用"nccopy-k4"将其转换为NetCDF4/HDF5格式。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- HDF5 H5Dread内存使用过多