erlang 如何删除字符串中的行而不为新字符串分配内存?

dy2hfwbg  于 2023-02-14  发布在  Erlang
关注(0)|答案(1)|浏览(130)

我想从一个大的文本文件中删除一些行,但我不想分配比保存原始字符串所需的更多的内存。到目前为止,我只能管理以下内容:

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来实现这一点?

6bc51xsx

6bc51xsx1#

根据您希望对结果执行的操作,一种显著减少内存使用的方法是避免首先构建字符串并使用IO data
在您的示例中,这可以通过删除对Enum.join/1的调用并将Stream.reject/2替换为Enum.reject/2来实现:

|> Enum.reject(&Regex.match?(~r{<date_of_creation>.*</date_of_creation>\n}, &1))

这将返回一个IO列表,它可以直接用于I/O,你可能根本不需要这个字符串。这就是Phoenix如何高效地呈现模板/JSON的:首先避免了昂贵的串连接。
假设您必须使用分隔符(Enum.join/2)进行连接,则Enum.intersperse/2可以用于构建IO列表。

相关问题