我可能只是徒劳地花了一天的计算时间:)
问题是我(天真地)写了大约 3.5GB 的(压缩的)[(Text, HashMap Text Int)]
数据到一个文件,那时我的程序崩溃了。当然没有最终的]
在数据的末尾,它的庞大规模使得手动编辑它是不可能的。
数据通过 Prelude.show
格式化就在这一点上,我意识到 Prelude.read
在返回任何数据之前,需要将整个数据集放入内存(不可能)。
现在......有没有办法恢复数据而无需手动编写解析器?
更新 1
main = do
s <- getContents
let hs = read s :: [(String, M.Map String Integer)]
print $ head hs
我试过这个......但它只是不断消耗更多的内存,直到它被操作系统杀死。
最佳答案
有点。您仍将手动编写解析器……但它是一个非常短且非常易于编写的解析器,因为几乎所有的解析器都会发送到 read
。 .想法是这样的:read
是严格的,但是 reads
,在处理单个元素时,是懒惰的。所以我们只需要去掉 reads
的位。在处理单个元素时不期望。这是一个帮助您入门的示例:
> let s = "[3,4,5," ++ undefined
> reads (drop 1 s) :: [(Int, String)]
[(3,",4,5,*** Exception: Prelude.undefined
我包括了
undefined
最后作为证据表明它实际上没有阅读整个String
在生成解析后的 3
之前在列表的顶部。
关于haskell - 有没有办法懒惰地 `read`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558786/