8

在 haskell 中读取大文件(大约 1 TB)的最佳方法是什么。基本上,该文件包含一个整数数据矩阵。我可能需要(有效地)计算不同行之间或列之间的相关性。

我以前为此使用过 pytables,但正在考虑在 haskell 中尝试相同的方法。我知道 haskell 有一些 hdf5 绑定,但还有其他我不知道的选项吗?

4

3 回答 3

13

与任何其他语言一样:您寻找(使用System.IO.hSeek),然后使用二进制 IO(Data.ByteString.hGet)。然后您解析结果(例如使用 attoparsec)并根据需要进行处理。

于 2013-09-24T15:38:27.283 回答
10

你也可以试试mmap 。例如,您可以将整个文件映射为ByteString

import Data.ByteString as B
import System.IO.MMap

main = do
    bs <- mmapFileByteString "myLargeFile" Nothing
    let l = B.length bs
    print l
    -- print last 1024 bytes:
    let bs2 = B.drop (l - 1024) bs
    print (B.unpack bs2)

从中切出一块很快 - 没有数据被复制。然后你可以使用任何工具来解析ByteStrings.

于 2013-09-24T19:49:29.527 回答
4

考虑iteratee包。它支持seek,并且attoparsec-iteratee包提供与 attoparsec 的集成。

Roman 建议的hSeek+hGet方法是低级的。iteratee是更高级别的方法,但对初学者来说可能更难。

于 2013-09-24T16:20:37.490 回答