编辑:基于额外的实验,我相当有信心减缓发生响应许多调用文件打开和关闭例程(h5open和close).我现在的时间有点短,但会在接下来的几天内回来添加更多的代码/细节.
使用Julia的HDF5软件包,我注意到h5write如果一个人对调用h5write和执行多次迭代,函数开始变慢h5read.有趣的是,似乎对于行为非常明显,人们应该在少量文件中读取和写入大量位置.我正在谈论的行为的演示可以通过启动Julia会话并运行以下子例程来获得(注意,您将需要HDF5包):
#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
Run Code Online (Sandbox Code Playgroud)
此代码将浮点数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
Run Code Online (Sandbox Code Playgroud)
h5read在子程序中,时间相当一致.但是,时间h5write逐渐变慢.到最后,写入比开始时要长一个数量级.我理解,对于每个文件,随着我们增加位置的数量,写入(和读取)的时间可能会稍微慢一点.但在这种情况下,即使在我们开始新文件之后,性能仍然会下降.也许最奇怪的是,我们可以再次运行子程序,并且写入的时间将在我们上一次运行中停止的地方进行.将写入恢复到最快速度所需的时间的唯一方法是完全重启Julia.
最后的免责声明:我对朱莉娅和hdf5都是全新的,所以我可能做了一些愚蠢的事情或者忽略了一些明显的东西.
经济放缓确实令人好奇; 分析表明,几乎所有的时间都花在了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
Run Code Online (Sandbox Code Playgroud)
这样您就可以在整个测试过程中打开文件.在我的机器上,这快了100倍.