2017-03-24 58 views
2

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

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

我可以想象三种可能的原因,io.lines()呼叫是首选。

  1. 迭代器比while循环
  2. 文件读取更有效地处理更加高效
  3. 它更容易阅读/维护代码

lua的文档也促进啜文件

(Y)ou应该总是考虑替代读取整个文件 与选项 “*所有” 从io.read,然后使用gfind打破它(21.1 – The Simple I/O Model

假设io:read("*line")流文件。如果lua中slurping的效率更高,并且io.lines()会掠夺该文件,那么io.lines()可能会因此而更加高效。

然而,the unofficial Lua FAQ有以下谈谈io.lines()

请注意,这是一个迭代器,这不会带来 整个文件到内存中开始。

这建议流式传输而不是sl浆式。

TLDRio.lines()是否曾将整个文件保存在内存中,还是一次只保存一行内存?在while循环中,其内存使用量是否与io:read("*line")不同?

回答

2

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

+0

为了澄清,io.lines是否曾将整个文件保存在内存中?我知道我一次只能访问一行,但是它的内存使用情况不同于io:while(while)循环中的read(“* line”)? – Cecilia