Haskell で巨大なファイル (約 1 TB) を読み取る最良の方法は何ですか。基本的に、ファイルには整数データの行列が含まれています。そして、異なる行間または列間の相関を(効率的に)計算する必要があるかもしれません。
以前はこれに pytables を使用していましたが、haskell で同じことをしようと考えていました。haskell にはいくつかの hdf5 バインディングがあることは知っていますが、私が認識していない他のオプションはありますか?
Haskell で巨大なファイル (約 1 TB) を読み取る最良の方法は何ですか。基本的に、ファイルには整数データの行列が含まれています。そして、異なる行間または列間の相関を(効率的に)計算する必要があるかもしれません。
以前はこれに pytables を使用していましたが、haskell で同じことをしようと考えていました。haskell にはいくつかの hdf5 バインディングがあることは知っていますが、私が認識していない他のオプションはありますか?
他の言語と同様に、( を使用して) シークしてSystem.IO.hSeek
から、バイナリ IO ( 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
s を解析できます。
iterateeパッケージを検討してください。seekをサポートし、attoparsec-iterateeパッケージは attoparsec との統合を提供します。
hSeek
+ Roman が提案するhGet
アプローチは低レベルです。iteratee
より高いレベルのアプローチですが、初心者には難しいかもしれません。