我想从一个大的文本文件中删除一些行,但我不想分配比保存原始字符串所需的更多的内存。到目前为止,我只能管理以下内容:
s
|> StringIO.open()
|> then(fn {:ok, device} ->
IO.binstream(device, :line)
end)
|> Stream.reject(&Regex.match?(~r{<date_of_creation>.*</date_of_creation>\n}, &1))
|> Enum.join()
但是由于结尾处的join,这最终会使原始字符串所需的内存加倍。有没有更好的方法只使用Elixir/Erlang来实现这一点?
1条答案
按热度按时间6bc51xsx1#
根据您希望对结果执行的操作,一种显著减少内存使用的方法是避免首先构建字符串并使用
IO data
。在您的示例中,这可以通过删除对
Enum.join/1
的调用并将Stream.reject/2
替换为Enum.reject/2
来实现:这将返回一个IO列表,它可以直接用于I/O,你可能根本不需要这个字符串。这就是Phoenix如何高效地呈现模板/JSON的:首先避免了昂贵的串连接。
假设您必须使用分隔符(
Enum.join/2
)进行连接,则Enum.intersperse/2
可以用于构建IO列表。