【发布时间】:2012-05-18 08:59:23
【问题描述】:
我正在编写一个网络文件传输应用程序。使用 Lazy ByteString 作为中间体
import qualified Data.ByteString.Lazy as BSL
从本地文件构造BSL时,将BSL放到Socket的句柄中:
BSL.readFile filename >>= BSL.hPut remoteH -- OK
这很好用。内存使用是恒定的。但是对于从 Socket 接收数据,则写入本地文件:
BSL.hGet remoteH size >>= BSL.hPut fileH bs -- starts swapping in 1 second
我可以看到内存使用量不断增加,BSL 占用 size 字节的内存。 更糟糕的是,对于超出我的物理内存大小的大 size,操作系统会立即开始交换。
我必须递归地接收字节串的片段。没关系。
为什么 BSL 会这样?
【问题讨论】:
标签: sockets memory haskell lazy-evaluation bytestring