elixir - 在 Elixir 中附加到文件的最佳方法是什么

标签 elixir

我一直坚持一些简单的任务。假设我们有一些伪代码:

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/

相关文章:

elixir - 在 Ecto phoenix.gen.html 中使用 'belongs_to' 出错

pattern-matching - 了解 Elixir 函数参数中的模式匹配

docker - 使用Docker-Compose UP进行Elixir测试

erlang - 在 Elixir 中比较 map 的方法

postgis - 在变更集验证之前在哪里以及如何包装参数?

elixir - 为什么文件读取会因 STDIO 或 File.open 而异?

ubuntu - 如何在 Ubuntu 15.10 上安装最新的 Elixir 版本(目前为 1.2)?

elixir - 使用 Elixir 将日期和时间转换为 future 的日期

elixir - "&1"在 elixir 函数中是什么意思?

elixir - 如何在 Elixir 中测试多行输出?