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 との統合を提供します。

hSeek+ Roman が提案するhGetアプローチは低レベルです。iterateeより高いレベルのアプローチですが、初心者には難しいかもしれません。

于 2013-09-24T16:20:37.490 に答える