首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将惰性ByteString转换为严格ByteString

将惰性ByteString转换为严格ByteString
EN

Stack Overflow用户
提问于 2011-10-19 08:50:06
回答 5查看 10.3K关注 0票数 23

我有一个函数,它接受一个列表,我希望返回strict ByteStrings的列表(懒惰应该转移到输出的lazy ByteString类型)。

代码语言:javascript
复制
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
csVals :: L.ByteString -> [B.ByteString]

我想这样做的原因有很多,several lexing functions需要严格的ByteStrings,我可以保证在上面的csVals的输出中输出的严格ByteStrings非常小。

在没有ByteString**s [chunking](http://hackage.haskell.org/packages/archive/bytestring/latest/doc/html/Data-ByteString-Lazy.html#v:toChunks) them的情况下,我该如何对ByteString**s进行“严格限制”?**

Update0

我想使用一个Lazy ByteString,并创建一个包含其所有数据的严格ByteString

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-18 23:27:52

就像@sclv在上面的评论中所说的,懒惰的字节串只是一个严格的字节串列表。有两种方法可以将懒惰的ByteString转换为严格的(来源:haskell mailing list discussion about adding toStrict function) -来自以下电子邮件线程的相关代码:

首先,相关的库:

代码语言:javascript
复制
import qualified Data.ByteString               as B
import qualified Data.ByteString.Internal      as BI
import qualified Data.ByteString.Lazy          as BL
import qualified Data.ByteString.Lazy.Internal as BLI
import           Foreign.ForeignPtr
import           Foreign.Ptr

方法1(与@sclv相同):

代码语言:javascript
复制
toStrict1 :: BL.ByteString -> B.ByteString
toStrict1 = B.concat . BL.toChunks

方法2:

代码语言:javascript
复制
toStrict2 :: BL.ByteString -> B.ByteString
toStrict2 BLI.Empty = B.empty
toStrict2 (BLI.Chunk c BLI.Empty) = c
toStrict2 lb = BI.unsafeCreate len $ go lb
  where
    len = BLI.foldlChunks (\l sb -> l + B.length sb) 0 lb

    go  BLI.Empty                   _   = return ()
    go (BLI.Chunk (BI.PS fp s l) r) ptr =
        withForeignPtr fp $ \p -> do
            BI.memcpy ptr (p `plusPtr` s) (fromIntegral l)
            go r (ptr `plusPtr` l)

如果性能是一个问题,我建议查看上面的电子邮件线程。它也有标准基准。在这些基准测试中,toStrict2比toStrict1更快。

票数 17
EN

Stack Overflow用户

发布于 2012-11-30 02:16:48

现在,bytestring包导出一个toStrict函数:

http://hackage.haskell.org/packages/archive/bytestring/0.10.2.0/doc/html/Data-ByteString-Lazy.html#v:toStrict

这可能不是您想要的,但它肯定回答了本文标题中的问题:)

票数 39
EN

Stack Overflow用户

发布于 2011-10-19 14:30:42

如果所讨论的延迟ByteString是严格ByteString的最大大小的<=:

代码语言:javascript
复制
toStrict = fromMaybe SB.empty . listToMaybe . toChunks

toChunks使每个块尽可能大(可能最后一个除外)。

如果惰性ByteString的大小大于严格ByteString的大小,那么这是不可能的:这正是惰性ByteStrings的用途。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7815402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档