加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

haskell – 延迟数据类型的内存使用情况

发布时间:2020-12-15 04:37:40 所属栏目:Java 来源:网络整理
导读:我编写了一个程序,用于分析文件中的数据并对其执行操作.我的第一个实现使用Data.ByteString来读取文件的内容.然后使用Data.Vector.Unboxed将此内容转换为样本Vector.然后,我对此(未装箱的)样本值向量执行处理和分析. 就像一个实验一样,我想知道如果我使用Has
我编写了一个程序,用于分析文件中的数据并对其执行操作.我的第一个实现使用Data.ByteString来读取文件的内容.然后使用Data.Vector.Unboxed将此内容转换为样本Vector.然后,我对此(未装箱的)样本值向量执行处理和分析.

就像一个实验一样,我想知道如果我使用Haskell的懒惰会发生什么.我决定使用Data.ByteString.Lazy而不是Data.ByteString和Data.Vector而不是Data.Vector.Unboxed来进行这个简单的测试.我希望看到内存使用量有所改善.即使我的程序最终需要知道每个样本的值,我仍然希望内存使用量逐渐增加.当我描述我的程序时,结果让我感到惊讶.

我的原始版本在大约20ms内完成,其内存使用情况如下所示:

enter image description here


这看起来像我的懒惰行为.样本似乎被加载到内存中,因为我的程序需要它们.

使用Data.Vector和Data.ByteString给出了以下结果:

enter image description here


这看起来与懒惰行为相反.所有样品似乎立即加载到内存中,然后逐个删除.

我怀疑这与我对Boxed和Unboxed类型的误解有关,所以我尝试将Data.ByteString.Lazy与`Data.Vector.Unboxed’一起使用.这是结果:

enter image description here


我不知道如何解释我在这里看到的内容.

谁能解释我得到的结果?

编辑
我正在使用hGet从文件中读取,这给了我一个Data.ByteString.Lazy.我通过以下函数将此ByteString转换为Floats的Data.Vector:

toVector :: ByteString -> Vector Float
toVector bs =  U.generate (BS.length bs `div` 3) $i ->
     myToFloat [BS.index bs (3*i),BS.index bs (3*i+1),BS.index bs (3*i+2)]
  where
    myToFloat :: [Word8] -> Float
    myToFloat words = ...

浮点数以3个字节表示.

处理的其余部分主要包括将高阶函数(例如滤波器,映射等)应用于数据.

EDIT2
我的解析器包含一个函数,该函数从文件中读取所有数据,并在样本矢量中返回此数据(使用之前的toVector函数).我写了这个程序的两个版本,一个是Data.ByteString,另一个是Data.ByteString.Lazy.我用这两个版本来执行一个简单的测试:

main = do
  [file] <- getArgs
  samples <- getSamplesFromFile file
  let slice = V.slice 0 100000 samples
  let filtered = V.filter (>0) slice
  print filtered

严格版本给了我以下内存使用情况:

enter image description here


懒惰版本给我以下内存使用情况:

enter image description here


这个结果似乎与我期待的完全相反.有人可以解释一下吗? Data.ByteString.Lazy有什么问题?

解决方法

到目前为止,我们的数据不足以重现问题.在这里,我运行了四个版本的 http://sprunge.us/PeIJ更改严格到懒惰和盒装到未装箱.我正在使用ghc -O2 -rtsopts -prof进行编译唯一值得注意的是,Data.Vector版本中的向量或流中的每个真实(指针)元素都指向一个漂亮的盒装Haskell浮点数,它占用了一个堆空间.一切都基本相同,除了Data.Vector程序,正如预期的那样,这些精心打包的浮动顶部有一大堆蓝色.

enter image description here

编辑
如果我只使用ghc -prof -rtsopts,这就是我得到的

enter image description here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读