随机访问haskell中的一个巨大文件

时间:2013-09-24 15:08:29

标签: haskell

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

我之前使用过pytables但是想在haskell中尝试相同的方法。我知道haskell有一些hdf5绑定但是还有其他我不知道的选项吗?

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分: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)

切出一块很快 - 没有数据被复制。然后,您可以使用任何工具来解析ByteString s。

答案 2 :(得分:4)

考虑iteratee包。它支持seekattoparsec-iteratee包提供与attoparsec的集成。

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