性能 – Julia:快速写入文件

我正在编写一个求解器,需要在每个时间步写入少量数字.时间步长必须很小,因此我需要经常写输出.

This picture shows the code profiling.如您所见,突出显示的IO部分占用了执行时间的显着部分.

IO完成为

println(out_file, t, " ", v.P[1], " ", v.P[end])

我想在数据结构v中保存向量P的第一个和最后一个元素以及t的值.

从分析看来,大多数计算时间都是由string.jl函数(我没有定义)所采用的.

这让我想知道是否有更有效的方法来迭代地将输出写入文件.

有什么建议吗?

谢谢

附加信息

输出文件在执行开始时打开一次,并保持打开直到结束.
我无法报告整个代码,因为它很长,但它是如此

out_file = open("file.out", "w")

delta_t = computeDeltaT()
t = 0
while t<T
  P = computeP()

  println(out_file, t, " ", P[1], " ", P[end])

  delta_t = computeDeltaT()
  t += delta_t
end

close(out_file)

我需要迭代编写,因为解决方案及时发展,我不知道delta_t将如何变化.所以我不能预先分配P.此外,它将是一个巨大的矩阵,就像数百万乘以5.

编辑

@isebarn通过每100个步骤打印确实减少了执行时间.此外,我将尝试添加第二个工作人员来处理IO,这样我就不会丢失数据.

最佳答案 通过迭代,你的意思是另一个应用程序/程序必须能够在写入之间读取文件吗?否则你只需打开一次流然后在结束时关闭.

f = open(outfile,"w") # do this once
for i in someloop
    # do something
    write(f, "whatever") # write to stream but not flushed to disk
end
close(f) # now everything is flushed to the disk (i.e. now outfile will have changed)

如果您需要在此过程中访问该文件,那么您可以在每次迭代期间打开/关闭(可能写入比println更快,将其分析以进行检查)或者您可以每N次迭代打开/关闭流以平衡两者?

编辑:
资源:
http://docs.julialang.org/en/release-0.4/manual/networking-and-streams/

就像@isebarn所说,将二进制写入hdf5也可能更快.不过不确定.

此外,IO通常也是这些场景中的限制因素.另一件要尝试的是,如果有一种估计P的方法,你可以预先分配,然后修剪它?

点赞