Julia HDF5包中h5write功能逐渐减慢

时间:2014-07-13 00:22:11

标签: hdf5 julia

编辑:基于其他实验,我非常有信心在响应对文件打开和关闭例程(h5open和{{1}的多次调用时发生的减速})。我现在的时间有点短,但会在接下来的几天内回来添加更多的代码/细节。

对Julia使用HDF5软件包,我注意到如果对closeh5write的调用进行多次迭代,h5write函数会开始变慢。有趣的是,似乎对于行为非常明显,人们应该在少量文件中读取和写入大量位置。我正在谈论的行为的演示可以通过启动Julia会话并运行以下子例程来获得(注意,您将需要HDF5包):

h5read

此代码使用#Set parameters numFile = 10; numLocation = 10000; writeDir = "/home/colin/Temp/"; FloatOut = 5.5; #Import functions using HDF5 #Loop over read/writes. c1 = 1; timeMat = Array(Float64, numFile * 2, 2); for i in 1:numFile filePath = string(writeDir, "f", string(i), ".h5"); for j in 1:numLocation location = string("G1/L", string(j)); if j == 1 || j == numLocation; tic(); end; h5write(filePath, location, FloatOut); if j == 1 || j == numLocation; timeMat[c1, 1] = toc(); end; if j == 1 || j == numLocation; tic(); end; FloatIn = h5read(filePath, location); if j == 1 || j == numLocation; timeMat[c1, 2] = toc(); end; if j == 1 || j == numLocation; c1 = c1+1; end; end rm(filePath); end 将浮点数5.5(无特殊原因选择)写入每个10,000文件中的10个位置。每次执行写入操作后,立即使用h5write读回该数字。对于每个文件,我将执行写入和读取操作所花费的时间存储到h5read中每个文件的第一个和最后一个位置(注意:最初,我存储了每个调用的时间但是为了解决这个问题的目的,这个细节层次是不必要的。时间印在下面:

timeMat

h5write h5read 0.0007 0.0004 0.0020 0.0004 0.0020 0.0004 0.0031 0.0004 0.0034 0.0004 0.0049 0.0004 0.0050 0.0004 0.0064 0.0005 0.0068 0.0004 0.0082 0.0004 0.0084 0.0005 0.0106 0.0005 0.0114 0.0005 0.0114 0.0005 0.0120 0.0005 0.0131 0.0005 0.0135 0.0005 0.0146 0.0005 0.0151 0.0005 0.0163 0.0005 的时间在子程序中相当一致。但是,h5read的时间逐渐变慢。到最后,写入比开始时要长一个数量级。我理解,对于每个文件,随着我们增加位置的数量,写入(和读取)的时间可能会稍微慢一点。但在这种情况下,即使在我们开始新文件之后,性能仍然会下降。也许最奇怪的是,我们可以再次运行子程序,并且写入的时间将在我们上一次运行中停止的地方进行。将写入恢复到最快速度所需的时间的唯一方法是完全重启Julia。

最终免责声明:我对朱莉娅和hdf5都是全新的,所以我可能做了一些愚蠢的事情或者忽略了一些明显的事情。

1 个答案:

答案 0 :(得分:5)

经济放缓确实很奇怪; profiling表明几乎所有时间都用在close函数中,基本上只是ccall。这表明它可能是HDF5 C库本身的一个问题。

如果每次编写变量时都不打开和关闭文件,我认为你会对性能感到满意。相反,通过文件对象访问该文件。这是一个例子:

filePath = string(writeDir, "f", string(i), ".h5")
h5open(filePath, "w") do file
    global c1
    for j in 1:numLocation
        ...
        write(file, location, FloatOut)
        ...
        FloatIn = read(file, location)
        ...
    end
end

这样您就可以在整个测试过程中打开文件。在我的机器上,这快了100倍。

如果您想进一步追究此问题,请提交issue