HaskellのByteStringの話。strictのほうのByteStringの話。

これ、たぶんappendとかsplitAtとかで結果したり分割したりをくりかえすような使いかたには向いてない。

たぶん。

たぶん、appendした場合には大きい領域が確保されて、そこに結合される2つの文字列がコピーされる。

splitAtされる場合には、新しいByteStringはもとのByteStringのそれぞれの一部を指すようになる。

そうするとappendとsplitAtをくりかえした場合、文字列の領域はどんどん大きくなる。これはたぶん単一のメモリ領域として確保されるので、別々にGCはされない。

そういう形でスペースリークが生じるのだと思う。

で、これを防ぐにはsplitAtしたあとにData.ByteString.Copyをすればいいのだと思うけど、それよりも多分lazyなほうのByteStringを使ったほうがベターなように思う。

Reply to this note

Please Login to reply.

Discussion

HaskellのByteStringの話。strictのほうのByteStringの話。

これ、たぶんappendとかsplitAtとかで結果したり分割したりをくりかえすような使いかたには向いてない。

たぶん。

たぶん、appendした場合には大きい領域が確保されて、そこに結合される2つの文字列がコピーされる。

splitAtされる場合には、新しいByteStringはもとのByteStringのそれぞれの一部を指すようになる。

そうするとappendとsplitAtをくりかえした場合、文字列の領域はどんどん大きくなる。これはたぶん単一のメモリ領域として確保されるので、別々にGCはされない。

そういう形でスペースリークが生じるのだと思う。

で、これを防ぐにはsplitAtしたあとにData.ByteString.Copyをすればいいのだと思うけど、それよりも多分lazyなほうのByteStringを使ったほうがベターなように思う。