2009-09-21 105 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。它的目的就是爲了做到這一點。

相關問題