什么是在Haskell中读取大文件(约1 TB)的最佳方法?
基本上,该文件包含整数数据矩阵。 我可能需要(高效地)计算不同行或列之间的相关性。
我之前使用过pytables来完成这个任务,但是想尝试在Haskell中实现相同的操作。 我知道Haskell有一些hdf5绑定,但是否还有其他选项我不知道呢?
就像其他语言一样:您使用 System.IO.hSeek
进行查找,然后使用二进制 I/O (Data.ByteString.hGet
)。 然后解析结果(例如使用 attoparsec),并根据需要进行处理。
您也可以尝试使用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
。
hSeek
+hGet
方法是低级别的方法。iteratee
是一种更高级别的方法,但对初学者可能更难。
ByteString
,网址为http://lambda.haskell.org/platform/doc/current/ghc-doc/libraries/bytestring-0.10.0.2/index.html。 - vioriorbytestring
进行随机访问?例如,如何从1TB文件中读取最后1KB,然后从中间读取1KB,再从开头读取1KB等等?据我所见,这样做会导致内存溢出错误。 - YurasGHC.IO.Handle
和GHC.IO.Handle.FD
。 - wit