Haskell を使用して大きなファイルを処理しようとしています。入力ファイルをバイトごとに参照し、バイトごとに出力バイトを生成したいと思います。もちろん、適切なサイズ (数 KB) のブロックで IO をバッファリングする必要があります。私にはそれができません。あなたの助けが必要です。
import System
import qualified Data.ByteString.Lazy as BL
import Data.Word
import Data.List
main :: IO ()
main =
do
args <- System.getArgs
let filename = head args
byteString <- BL.readFile filename
let wordsList = BL.unpack byteString
let foldFun acc word = doSomeStuff word : acc
let wordsListCopy = foldl' foldFun [] wordsList
let byteStringCopy = BL.pack (reverse wordsListCopy)
BL.writeFile (filename ++ ".cpy") byteStringCopy
where
doSomeStuff = id
このファイルに という名前を付けTestCopy.hsて、次の操作を行います。
$ ls -l *MB
-rwxrwxrwx 1 root root 10000000 2011-03-24 13:11 10MB
-rwxrwxrwx 1 root root 5000000 2011-03-24 13:31 5MB
$ ghc --make -O TestCopy.hs
[1 of 1] Compiling Main ( TestCopy.hs, TestCopy.o )
Linking TestCopy ...
$ time ./TestCopy 5MB
real 0m5.631s
user 0m1.972s
sys 0m2.488s
$ diff 5MB 5MB.cpy
$ time ./TestCopy 10MB
real 3m6.671s
user 0m3.404s
sys 1m21.649s
$ diff 10MB 10MB.cpy
$ time ./TestCopy 10MB +RTS -K500M -RTS
real 2m50.261s
user 0m3.808s
sys 1m13.849s
$ diff 10MB 10MB.cpy
$
私の問題: 5MB と 10MB のファイルには大きな違いがあります。パフォーマンスが入力ファイルのサイズに比例するようにしたいと思います。私が間違っていることを教えてください。どうすればこれを達成できますか? 動作する限り、遅延バイト文字列などを使用してもかまいませんが、標準の ghc ライブラリである必要があります。
精度: 大学のプロジェクト用です。そして、私はファイルをコピーしようとしていません。関数は、doSomeStuffカスタマイズする必要がある圧縮/解凍アクションを実行します。