非常に大きな文字列を作成するプログラムがあります。現在、私はレイジーを使用していByteString
ます。問題のパラメーターを以下にまとめます。
現在の実装では、約 50 万文字まで動作し、後で単純にメモリ不足になります (~600MB)。これ (文字数) を 50MB 未満で実行したいと考えています。
構築中は文字列にアクセスしません。これにより、多くのサンクが発生し、メモリの問題が発生する可能性があります。私はsBuilder
を作成するために使用していByteString
ますが、厳密なバージョンはないようですBuilder
(または、少なくとも見つけることができません)。
ビルド中に文字列をファイルに入れることはできません。文字列をファイルに配置する前に、ビルド操作全体を実行する必要があります。
ユニコードのサポートは必要ありません。7 ビットの ascii でも構いません。ByteString
ただし、ユニコード文字をエンコードするためにメモリを無駄にしないと思います。
私が試したこと:
構築中の をseq
呼び出します。ByteString
これは 50 ~ 100k 文字で機能するようですが、その後の効果は同じです。
厳密なByteString
s の使用。使い方がわからなかったBuilder
ので、リストとconcat
.
を使用しUArray Int Char
ます。これは、文字列のサイズを事前に把握して配列全体を割り当てるか、大量の中間データ構造を持つことを意味します。