我正在尝试使用Haskell处理大文件。我希望能够逐字节浏览输入文件,并逐字节生成输出文件。当然,我需要IO缓冲区的块大小合理(几KB)。但我做不到,所以需要您的帮助。
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函数应执行我必须自定义的压缩/解压缩操作。
cabal unpack blaze-builder
-- 现在你已经获取了源代码,可以直接将需要的文件移动到你的存储库中。 - sclv