我一直坚持一些简单的任务。假设我们有一些伪代码:
Enum.each 1..1_000_000, fn(id) ->
some_complex_method(id) |> save_results
end
在哪里
save_results
是def save_results(data) do
{:ok, file} = File.open "data.log", [:append]
Enum.each(data, &(IO.binwrite(file, &1)))
File.close file
end
问题是如果我们的范围真的很大,我们会花时间打开和关闭文件。如何让它处理打开状态并在工作完成时调用关闭方法?
最佳答案
而不是 :append
作为写入模式使用 {:delayed_write, non_neg_integer, non_neg_integer}
为了使您的写入得到缓冲,直到达到一定数量的要写入的数据或达到一定的时间。不要忘记使用 :append
另外,如果您只打算在文件末尾追加!
第一个non_neg_integer
是在写入发生之前要缓冲的大小(以字节为单位)。
第二个non_neg_integer
是写入发生前缓冲的延迟毫秒数。更详细的解释请访问 the erlang documentation of :file.open/2
.
对于其他可能的模式,请查看 elixir documentation for File.open/2
您的示例可能如下所示:
Enum.each 1..1_000_000, fn(id) ->
some_complex_method(id) |> save_results
end
在哪里 save_results
是def save_results(data) do
{:ok, file} = File.open "data.log", [:append, {:delayed_write, 100, 20}]
Enum.each(data, &(IO.binwrite(file, &1)))
File.close file
end
我无法判断这种确切的配置是否适合您的情况,但它肯定会减少文件打开的数量。翻译上面的配置意思是:
亲爱的
File
模块,请缓冲我对文件
data.log
的写入直到我要求你写至少 100 字节的数据,或者直到你等了 20 毫秒让我给你更多的数据来写。非常感谢你!
真正属于你的
your elixir coder
关于elixir - 在 Elixir 中附加到文件的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37461981/