我意识到这可能是一个相当离经叛道的问题,但我想知道是否可以通过System.IO.Posix.MMap映射数据文件,然后将生成的ByteString cast到其他类型的严格数组中?例如:如果我知道这个文件包含双精度的数据,我能不能以某种方式将这个mmapped数据放到一个UArr双精度中,这样我就可以对它执行sumU等操作,并让虚拟内存系统为我处理IO?这基本上就是我在C++代码中处理多GB数据集的方式。另类更地道的方式来做这也很感谢,谢谢!
我还可以对数据进行多核处理的最高加分:-)不是我所要求的。
发布于 2009-09-21 15:53:49
我不认为这样做是安全的。UArr是Haskell堆分配的未固定内存,GC会移动它。ByteStrings (和mmapped )是固定内存的ForeignPtrs。它们是运行时系统中的不同对象。
如果要将底层类型从ForeignPtr更改为Haskell值'a‘,则需要进行复制以确保安全。
发布于 2009-09-21 08:07:51
恐怕我不知道如何将ByteString转换为UArr T,但我想通过建议您看看Data Parallel Haskell来获得一些“额外的分数”;从您所描述的问题来看,它可能就是您所熟悉的。
发布于 2009-09-22 20:35:20
您可能需要在这里使用Foreign.Marshal,尤其是Foreign.Marshal.Array。它的设计就是为了做到这一点。
https://stackoverflow.com/questions/1453192
复制相似问题