2009-09-21 66 views
2

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

我也可以对数据进行多核处理的方式的最高加分:-)不是我要求苛刻或任何事情。

回答

3

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

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

+0

谢谢;我担心情况会是这样。一旦他们需要被加载到任何语言的GC'd空间,我从来没有太多的运气操纵大数据集。我目前使用的只是mmap的方法通常没问题。将复制一些减少的数据集,看看事情如何运作。 – billt 2009-09-21 17:57:48

1

恐怕我不知道如何将ByteString投射到UArr T,但我想通过建议您看看Data Parallel Haskell来声明一些“加分”。从你所描述的问题来看,它可能就在你的街道上。

+0

是的,DPH和其他闪亮的哈斯克尔玩具真的很吸引人。一旦我掌握了更多的语言,我想尝试一下我的一些更大的问题(数据集在GB范围的最小值10的范围内)。 – billt 2009-09-21 17:58:40

0

您可能想在这里使用Foreign.Marshal,尤其是Foreign.Marshal.Array。它的目的就是为了做到这一点。

相关问题