将mmapped ByteString转换为其他类型?

时间:2009-09-21 07:12:10

标签: haskell io bytestring

我意识到这可能是一个相当异端的问题,但我想知道我是否可以通过System.IO.Posix.MMap mmap数据文件,然后将cast生成的ByteString转换为一些严格的数组其他类型?例如。如果我知道该文件包含双打,我能以某种方式将这个mmapped数据放入UArr Double中,这样我就可以对它进行sumU等操作,并让虚拟内存系统为我处理IO吗?这基本上就是我在C ++代码中处理多GB数据集的方式。另外更多惯用的方法也很感谢,谢谢!

我还可以对数据进行多核处理的最高额外要点:-)不是我要求的任何东西。

3 个答案:

答案 0 :(得分:3)

我认为这样做并不安全。 UArr是Haskell堆分配的unpinned内存,GC会移动它。 ByteStrings(和mmapped)是固定内存的ForeignPtrs。它们是运行时系统中的不同对象。

如果要将基础类型从ForeignPtr更改为Haskell值'a',则需要复制此项才能安全。

答案 1 :(得分:1)

我担心我不知道如何将ByteString投放到UArr T,但我想通过建议您查看{{{{1}}来获得一些“加分”。 3}};从你所描述的问题来看,它可能就在你的街道上。

答案 2 :(得分:0)

你可能想要Foreign.Marshal,尤其是Foreign.Marshal.Array。它的目的是做到这一点。