我无法将有效的浮点值大数据集有效地保存在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库为您缓冲写操作。应该很快。

在您的情况下,您可能想创建一个复合数据类型来保存表的每个记录。然后,您的数据集将是复合数据类型的一维数组。

注意:链接到示例代码中使用的方法是正确的。如果对您不起作用,那可能是因为您的块大小太小了。

10-04 14:15
查看更多