我有一个构建非常大的字符串的程序。目前我正在使用lazy ByteString
s。以下是总结的问题参数:
当前的实现最多可以处理大约 500k 个字符,之后只是内存不足(~600MB)。我希望这个(字符数量)在 50MB 以下运行。
在构建时不会访问该字符串。这可能会导致大量 thunk,从而导致内存问题。我Builder
用来制作ByteString
s,但似乎没有严格的版本Builder
(或者至少我找不到它)。
该字符串在构建时不能放入文件中。整个构建操作必须在字符串放入文件之前发生。
我不需要Unicode支持。即使是 7 位 ascii 也可以。我相信这ByteString
不会浪费内存来编码 unicode 字符。
我尝试过的事情:
seq
在构建 s 时调用ByteString
它们。这似乎适用于 50-100k 个字符,但之后效果是一样的。
使用严格ByteString
的 s。我不知道如何使用Builder
它们,所以我最终使用了列表和concat
.
使用UArray Int Char
. 这意味着要么提前知道字符串的大小并分配整个数组,要么拥有大量的中间数据结构。