io.lines()会流式传输还是啜饮文件?

时间:2017-03-24 16:53:26

标签: lua

对于支持逐行处理的算法,lua文档建议在while循环中使用io.lines()io:read("*line")更有效。

  

调用io.read(“* line”)返回当前输入的下一行   文件,没有换行符。 (...)但是,要迭代一个   整个文件一行一行,我们最好使用io.lines迭代器。 (21.1 – The Simple I/O Model

我可以想象io.lines()电话首选的三个可能原因。

  1. 迭代器比while循环
  2. 更有效
  3. 更有效地处理文件阅读
  4. 更容易阅读/维护代码
  5. lua文档还宣传了诽谤文件

      

    (Y)你应该总是考虑阅读整个文件的替代方案   使用来自io.read的选项“* all”然后使用gfind将其分解(21.1 – The Simple I/O Model

    假设io:read("*line")流式传输文件。如果lua中的slurping更有效,并且io.lines()会使文件出现问题,那么io.lines()可能因此更有效率。

    但是,the unofficial Lua FAQio.lines()

    有以下说法
      

    请注意,它是一个迭代器,这不会带来   最初将整个文件存入内存。

    这表明流式传输而不是啜饮。

    TLDR io.lines()是否将整个文件保存在内存中,或者一次只在内存中保留一行?它的内存使用量是否与while循环中的io:read("*line")不同?

1 个答案:

答案 0 :(得分:2)

io.lines()不会将整个文件保存在内存中:它一​​次读取一行文件,而不是一次读取整个文件。为此,请使用io.read("*all")