私はアカデミックな目的でhaskellに関する小さな(比較的)アプリケーションを書いています。このコードhttp://www.haskell.org/haskellwiki/Toy_compression_implementationsに基づいて、ハフマン圧縮を実装しています。
このコードの私の変種はここhttps://github.com/kravitz/har/blob/a5d221f227c27fd1c5587217a29a169a377521a6/huffman.hsであり、遅延バイト文字列を使用します。RLE圧縮を実装したとき、入力ストリームを1つのステップで処理するため、すべてがスムーズでした。しかし、ハフマンはそれを2回処理し、その結果、評価されたバイト文字列がメモリに格納されます。これは、大きなファイルには適していません(ただし、比較的小さなファイルの場合は、ヒープに割り当てられるスペースも多すぎます)。これは私の疑いだけではありません。プロファイリングでは、ヒープのほとんどがバイト文字列の割り当てによって消費されていることも示されているためです。
また、ファイル内のストリームの長さをシリアル化すると、メモリに完全なバイト文字列が読み込まれる可能性があります。ghcが親切でストリームを数回再評価すると言う簡単な方法はありますか?