【问题标题】:Casting an mmapped ByteString to other types?将映射的 ByteString 转换为其他类型?
【发布时间】:2009-09-21 07:12:10
【问题描述】:

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

对于我还可以对数据进行多核处理的方式,我还可以加分 :-) 并不是说​​我要求高。

【问题讨论】:

    标签: haskell io bytestring


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢;我担心会是这样。一旦需要将大型数据集加载到任何语言的 GC 空间中,我就没有太多的运气来处理它们。我目前的只是 mmap 'em 方法通常可以正常工作。将在一些简化的数据集上进行复制,看看结果如何。
    【解决方案2】:

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

    【讨论】:

    • 是的,DPH 和其他闪亮的 Haskell 玩具真的很吸引人。一旦我对语言有了更多的掌握,我想尝试解决我的一些更大的问题(数据集在 GB 范围最小值的 10 秒内)。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      相关资源
      最近更新 更多