如何有效地将数据附加到C中的HDF5表?

时间:2013-11-15 14:43:51

标签: c io hdf5

我无法有效地在HDF5文件中保存大型浮点值数据集。

数据采集的工作原理如下: 创建固定的“射线数据”阵列(协调,方向,波长,强度等)并将其发送到外部射线追踪程序(其大约2500个值)。 作为回报,我获得了相同的数组,但数据已更改。 我现在想要将新坐标保存在HDF5中,以便作为简单的表格进一步处理。 这些步骤重复多次(约80 000次)。

我按照HDF5group http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/examples/h5_extend_write.c的例子,但不幸的是解决方案很慢。

在我将数据直接写入hdf5文件之前,我使用了一个简单的csv文件,100次重复需要大约80秒,而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)
    }
}

我可以想象它与每一步扩展表的开销有关吗? 任何帮助将不胜感激。

欢呼声, 儒略

1 个答案:

答案 0 :(得分:1)

使用HDF5的低级API可以获得非常好的性能。我在this detailed answer中解释了如何做到这一点。

基本上你需要使用固定大小的数据集,如果你事先知道它的最终大小(最好的情况),或者使用你可以随意扩展的分块数据集(更多的代码,更多的开销,并选择良好的块大小对性能至关重要)。在任何情况下,您都可以让HDF5库为您缓冲写入。它应该非常快。

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

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