【发布时间】:2020-01-22 16:20:27
【问题描述】:
我一直被一些简单的任务所困。假设我们有一些伪代码:
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方法?
【问题讨论】:
-
您的 save_results 代码看起来不像每次都会打开和关闭文件。是什么让你相信这就是正在发生的事情?
-
对不起,我错过了伪代码中的重要部分。现在更新了。
-
如何在循环之前打开文件并在之后关闭它?感觉并不理想,但我相信它会适用于您的情况。如果您愿意做更多的工作,您可以轻松使用 GenServer,您可以在其中不断推送文件写入的内容。然后你让 GenServer 以一定的延迟写入文件,比如说 10 条消息。当 10 条消息或某个时间间隔结束时,您会将所有消息一起归档。
-
您可能还想通过
StringIO创建一个“buf”并写入它,就像这里建议的那样:stackoverflow.com/a/72048883/3995261
标签: elixir