haskell – 延迟数据类型的内存使用情况
我编写了一个程序,用于分析文件中的数据并对其执行操作.我的第一个实现使用Data.ByteString来读取文件的内容.然后使用Data.Vector.Unboxed将此内容转换为样本Vector.然后,我对此(未装箱的)样本值向量执行处理和分析.
就像一个实验一样,我想知道如果我使用Haskell的懒惰会发生什么.我决定使用Data.ByteString.Lazy而不是Data.ByteString和Data.Vector而不是Data.Vector.Unboxed来进行这个简单的测试.我希望看到内存使用量有所改善.即使我的程序最终需要知道每个样本的值,我仍然希望内存使用量逐渐增加.当我描述我的程序时,结果让我感到惊讶. 我的原始版本在大约20ms内完成,其内存使用情况如下所示: 这看起来像我的懒惰行为.样本似乎被加载到内存中,因为我的程序需要它们. 使用Data.Vector和Data.ByteString给出了以下结果: 这看起来与懒惰行为相反.所有样品似乎立即加载到内存中,然后逐个删除. 我怀疑这与我对Boxed和Unboxed类型的误解有关,所以我尝试将Data.ByteString.Lazy与`Data.Vector.Unboxed’一起使用.这是结果: 我不知道如何解释我在这里看到的内容. 谁能解释我得到的结果? 编辑 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 main = do [file] <- getArgs samples <- getSamplesFromFile file let slice = V.slice 0 100000 samples let filtered = V.filter (>0) slice print filtered 严格版本给了我以下内存使用情况: 懒惰版本给我以下内存使用情况: 这个结果似乎与我期待的完全相反.有人可以解释一下吗? Data.ByteString.Lazy有什么问题? 解决方法
到目前为止,我们的数据不足以重现问题.在这里,我运行了四个版本的
http://sprunge.us/PeIJ更改严格到懒惰和盒装到未装箱.我正在使用ghc -O2 -rtsopts -prof进行编译唯一值得注意的是,Data.Vector版本中的向量或流中的每个真实(指针)元素都指向一个漂亮的盒装Haskell浮点数,它占用了一个堆空间.一切都基本相同,除了Data.Vector程序,正如预期的那样,这些精心打包的浮动顶部有一大堆蓝色.
编辑 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |