我一直坚持一些简单的任务。我们假设我们有一些伪代码:
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方法?
答案 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
了解更多