ネットワークファイル転送アプリケーションを書いています。中間としてLazyByteStringを使用する
import qualified Data.ByteString.Lazy as BSL
ローカルファイルからBSLを構築する場合は、BSLをソケットのハンドルに配置します。
BSL.readFile filename >>= BSL.hPut remoteH -- OK
これは正常に機能します。メモリ使用量は一定です。ただし、Socketからデータを受信する場合は、ローカルファイルに書き込みます。
BSL.hGet remoteH size >>= BSL.hPut fileH bs -- starts swapping in 1 second
メモリ使用量が増え続けていることがわかります。BSLはサイズバイトのメモリを使用します。さらに悪いことに、私の物理メモリサイズを超える大きなサイズの場合、OSはすぐにスワッピングを開始します。
ByteStringsのセグメントを再帰的に受信する必要があります。それは大丈夫です。
なぜBSLはそのように振る舞うのですか?