【发布时间】:2013-08-02 05:09:51
【问题描述】:
我想将一个巨大的列表 A 保存到一个文本文件中。 writeFile 似乎只在 A 的计算结束时保存列表,由于我的内存不足以存储整个列表而崩溃。
我已经尝试过使用
writeFile "test.txt" $ show mylistA
现在我已经尝试保存列表的元素,因为它们是使用以下方法计算的:
[appendFile "test2.txt" (show x)|x<-mylistA]
但它不起作用,因为:
使用 `print' 导致 (Show (IO ())) 没有实例可能的修复:在交互式 GHCi 命令的 stmt 中添加 (Show (IO ())) 的实例声明:打印它
你能帮我解决这个问题,或者给我一个解决方案,将我的巨大列表 A 保存到一个文本文件中吗?
谢谢
【问题讨论】:
-
首先应该没有问题。我使用
main = writeFile "test.txt" $ show [x | x <- [1..10^9]]进行了测试,即使没有优化,它也可以在恒定空间(使用 1.4MB)中运行。也许这是你如何构建mylistA的东西,它可以防止它被懒惰地消耗(第一个元素是否依赖于后面的元素?)。在这种情况下,您的替代解决方案根本没有帮助,您应该向我们提供更多代码来确定问题的原因。 -
是的,你是对的,@jozefg 解决方案工作正常,但我的内存使用似乎是由 mylistA 的生成引起的。 myListA 基本上是link @ephemient 的解决方案,我在其中添加了一些额外的约束,例如
myListA = [x|x<-(takeWhile (<=10000000000) primes),... ] -
也许可以转换成在恒定空间运行。也许不吧。你可以问一个单独的问题。
标签: haskell