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