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

时间:2016-05-26 13:16:31

标签: 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

问题是,如果我们的范围非常大,我们会花时间打开和关闭文件。工作完成后如何处理打开状态和调用close方法?

5 个答案:

答案 0 :(得分:2)

使用: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

答案 1 :(得分:1)

你能预先做好工作吗?只有在完成文件写作后才能完成工作吗?

For i = lnLastRow1 To lnTopRow1 Step -1
    For Each c In Rng
        If ws1.Range("Q" & i).Value = c.Value Then
            ws1.Cells(i, lnCols).Value = "KEEP"
            Worksheets("Sheet2").Range("H" & c.Row).Value = Range("C" & c.Row).Value ' MODIFY
            Exit For
        End If
    Next c
Next i

然后:

results = Enum.map 1..1_000_000, fn(id) ->
    some_complex_method(id)
end

其中:

log_results(results)

答案 2 :(得分:0)

看起来上面的代码看起来并不会在每次写入时打开和关闭文件,但如果有什么东西没有显示,那么我建议您也许想要用File.open/2代替File.stream!/3

答案 3 :(得分:0)

使用其他答案来编写一个小的附加函数:

filewriter = fn (filename, data) -> 
  File.open(filename, [:append]) 
  |> elem(1) 
  |> IO.binwrite(data) 
end

filewriter.("Rakefile", "here's a line to append!\n")

答案 4 :(得分:0)

您可以使用Path模块

Path.expand('./text.txt') |> Path.absname |> File.write("new content!", [:write])
# => :ok

在这里
Working With the File System in Elixir

了解更多
相关问题