如何在lua中读取一个大文件(1GB或更大)?

3

我一直在寻找这个问题的答案,但每个人的答案都是逐行操作,然而我的文件只有一行字符,尝试使用io.open("file.txt", "rb"):read("*a")会导致内存错误。我想不出如何分部分加载它,因为它只是一个巨大的行。


2
使用 :read(4096) 或类似的方式读取固定大小的块,怎么样? - Amadan
这个基本上和string.sub的作用一样,只不过是用来读取文件的,如果是这样的话,那正是我所需要的。 - 128Gigabytes
不同,因为它自己按顺序读取。与:seek(“set”,start)配合使用,您可以对文件执行与字符串上的.sub相同的操作。 - Amadan
1
任何编程语言中,你需要做的第一步是定位到文件中的某个位置,然后读取一定数量的字节。数据不被认为是“字符串”,但只是一组字节。 (据我所知,Lua不支持“内存映射文件”的概念。) - Mike Robinson
你能给我一个例子吗?比如假设文件长度为1,000个字符(实际上不是,它要长得多,这就是为什么我需要使用它)。我该如何仅获取500到750个字符? - 128Gigabytes
寻找到文件偏移量为499(文件偏移量从0开始计数)并读取250个字节。 - FareakyGnome
2个回答

3
你可以使用io.read(size)来读取指定大小的缓冲区(正如评论中已经讨论过的那样)。请参见《Lua编程》中I/O部分末尾的示例
由于你在读取块时进行搜索,所以你要考虑到你正在搜索的字符串可能分布在不同的块之间。《Lua编程》中的另一个例子,谈到了如何读取大文件,可能会有所帮助。

0

你可以使用表格作为缓冲区:

function readFile(file)
local t = {}
 for line in io.lines(file) do
    t[#t + 1] = line .. "\n"
end
  local s = table.concat(t)
  return s
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接