2

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

我还可以对数据进行多核处理的方式的最高附加分 :-) 并不是说​​我要求高或任何东西。

4

3 回答 3

3

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

如果要将基础类型从 ForeignPtr 更改为 Haskell 值“a”,则需要进行复制以确保安全。

于 2009-09-21T15:53:48.537 回答
1

恐怕我不知道如何将 aByteString转换为 a UArr T,但我想通过建议您查看Data Parallel Haskell来声明一些“额外点” ;从您描述的问题来看,它可能就在您的街道上。

于 2009-09-21T08:07:51.233 回答
0

您可能想要 Foreign.Marshal 在这里,尤其是Foreign.Marshal.Array。它的设计正是为了做到这一点。

于 2009-09-22T20:35:19.587 回答