我无法将有效的浮点值大数据集有效地保存在HDF5文件中。
数据采集工作如下:
将创建固定的“射线数据”数组(坐标,方向,波长,强度等),并将其发送到外部射线跟踪程序(大约2500个值)。
作为回报,我得到了相同的数组,但是数据发生了变化。
我现在想将新坐标保存在HDF5中,以作为一个简单表进行进一步处理。
这些步骤重复了很多次(大约80 000)。
我按照HDF5group http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/examples/h5_extend_write.c的示例进行,但不幸的是,解决方案的速度很慢。
在将数据直接写入hdf5文件之前,我使用了一个简单的csv文件,它需要大约80秒才能进行100次重复,而追加到hdf5文件上则需要160秒。
“伪”代码如下所示:
//n is a large number e.g. 80000
for (i=0;i<n;++i):
{
/*create an array of rays for tracing*/
rays = createArray(i);
/*trace the rays*/
traceRays(&rays);
/* write results to hdf5 file, m is a number around 2500 */
for(j=0;j<m;j++):
{
buffer.x = rays[j].x
buffer.y = rays[j].y
//this seems to be slow:
H5TBappend_records(h5file,tablename, 1,dst_size, dst_offset, dst_sizes, &buffer)
// this is fast:
sprintf(szBuffer, "%15.6E,%14.6E\n",rays[j].x,rays[j].y)
fputs(szBuffer, outputFile)
}
}
我可以想象这与在每个步骤扩展表的开销有关吗?
任何帮助,将不胜感激。
干杯,
朱利安
最佳答案
使用HDF5的低级API可以获得非常好的性能。我在this detailed answer中解释了如何执行此操作。
基本上,如果您事先知道固定大小的数据集(最好的情况),则需要使用固定大小的数据集,或者使用可以随意扩展的分块数据集(更多的代码,更多的开销以及选择一个好的数据块)尺寸对于性能至关重要)。无论如何,您都可以让HDF5库为您缓冲写操作。应该很快。
在您的情况下,您可能想创建一个复合数据类型来保存表的每个记录。然后,您的数据集将是复合数据类型的一维数组。
注意:链接到示例代码中使用的方法是正确的。如果对您不起作用,那可能是因为您的块大小太小了。