在Haskell中,在Lazy ByteString上调用length会强制整个字符串进入内存吗?

me2*_*me2 9 haskell lazy-evaluation bytestring

我正在使用延迟字节串读取大数据流,并且想要知道在解析它时是否至少有X个字节可用.也就是说,我想知道bytestring是否至少为X字节长.

调用length它会导致整个流加载,从而破坏了使用延迟字节串的目的吗?

如果是,那么后续将是:如何判断它是否至少有X个字节而不加载整个流?

编辑:最初我在阅读文件的上下文中询问,但了解有更好的方法来确定文件大小.然而,我需要的终极解决方案不应该依赖于懒惰的字节串源.

eph*_*ent 11

是.

length . take x.

  • @MtnViewMark:它可能会强制超过*x*字节,因为延迟字节串的严格性是按每个块发生的.强制块的第一个字符也会强制该块的其余部分. (3认同)
  • 对不起,简短的回答,我写得很快,没有时间回来扩展它.是的,`length`将强制整个字符串,而`length.take x`将仅强制包含第一个`x`字节的块,这可能超过'x`字节总数.我认为默认的块大小在31kB附近. (3认同)