【问题标题】:How can I read a large file (A gig or more) in lua?如何在 lua 中读取大文件(A gig 或更多)?
【发布时间】:2016-08-21 06:41:35
【问题描述】:

我一直在寻找这个问题的答案,每个人的答案都是一行一行的做,但问题是我的文件都是一行字符,并试图 io.open("file.txt" , "rb"):read("*a") 导致内存错误。我想不出如何一次加载它的一部分,因为就像我说的那样,它都是一条巨大的线。

【问题讨论】:

  • 使用:read(4096)或类似的方式读取固定大小的块怎么样?
  • 这与 string.sub 的工作原理是否基本相同,但用于读取文件,如果是的话,这正是我所需要的。
  • 不一样,因为它自己按顺序读取。与:seek("set", start) 协同工作,您可以对文件执行与字符串上的.sub 相同的操作。
  • 在 any 编程语言中,您必须先将seek 移动到文件中的某个位置,然后read 一定数量的bytes。 数据不被认为是“一个字符串”,本身,而只是一个字节块。 (据我所知,Lua 不支持“内存映射文件”的概念。)
  • 你能给我举个例子吗,比如假设文件有 1000 个字符长(它不是,它更长,这就是我需要使用它的原因)我怎样才能只抓取 500 到 750 个字符

标签: file memory lua


【解决方案1】:

您可以使用io.read(size) 读取指定大小的缓冲区(如 cmets 中所述)。请参阅Programming in Lua 中的example at the end of the I/O section。

由于您在读取的块中进行搜索,因此您正在搜索的字符串可能会在不同的块之间拆分,因此您需要考虑到这一点。 Another example from PiL that talks about reading large files 可能感兴趣。

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2016-10-03
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 2014-06-18
      • 2012-06-27
      • 2012-06-23
      相关资源
      最近更新 更多