gpt4 book ai didi

parsing - 如何使用 Data.ByteString 解析 7GB 文件?

转载 作者:行者123 更新时间:2023-12-02 20:58:17 29 4
gpt4 key购买 nike

我必须解析一个文件,实际上必须先读取它,这是我的程序:

import qualified Data.ByteString.Char8 as B
import System.Environment

main = do
args <- getArgs
let path = args !! 0
content <- B.readFile path
let lines = B.lines content
foobar lines

foobar :: [B.ByteString] -> IO()
foobar _ = return ()

但是,编译之后

> ghc --make -O2 tmp.hs 

使用 7GB 文件调用时,执行会出现以下错误。

> ./tmp  big_big_file.dat
> tmp: {handle: big_big_file.dat}: hGet: illegal ByteString size (-1501792951): illegal operation

感谢您的回复!

最佳答案

ByteString的长度是 Int 。如果Int是32位,7GB的文件会超出Int的范围并且缓冲区请求的大小将是错误的,并且很容易请求负大小。

readFile的代码将文件大小转换为Int用于缓冲区请求

readFile :: FilePath -> IO ByteString
readFile f = bracket (openBinaryFile f ReadMode) hClose
(\h -> hFileSize h >>= hGet h . fromIntegral)

如果溢出,最有可能的结果是“非法字节字符串大小”错误或段错误。

如果可能的话,使用惰性 ByteString s 来处理那么大的文件。就您而言,您几乎必须使其成为可能,因为使用 32 位 Int s,7GB ByteString是不可能创建的。

如果你需要严格的线条 ByteString s 进行处理,并且不会出现过长的行,可以通过懒惰ByteString实现这一目标

import qualified Data.ByteString.Lazy.Char8 as LC
import qualified Data.ByteString.Char8 as C

main = do
...
content <- LC.readFile path
let llns = LC.lines content
slns = map (C.concat . LC.toChunks) llns
foobar slns

但是如果你可以修改你的处理来处理懒惰 ByteString s,总体来说可能会更好。

关于parsing - 如何使用 Data.ByteString 解析 7GB 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10012106/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com