io.lines() 是流式读取还是一次性读取文件?

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

调用 io.read("*line") 会返回当前输入文件的下一行,不带换行符。(...) 然而,要逐行迭代整个文件,最好使用 io.lines 迭代器。(21.1 – 简单的 I/O 模型)

我想到了三个可能造成 io.lines() 被推荐的原因:

  1. 迭代器比 while 循环更高效
  2. 文件读取更高效
  3. 更容易读懂/维护代码

Lua 文档还推荐 slurping 文件

(Y)ou should always consider the alternative of reading the whole file with option "*all" from io.read and then using gfind to break it up (21.1 – 简单的 I/O 模型)

假设io:read("*line") 是流式读取文件的。如果 slurping 在 Lua 中更高效,而 io.lines() slurps 文件,则由此可以认为使用 io.lines() 更高效。

然而,非官方 Lua FAQ 有以下对于 io.lines() 的描述:

注意它是个迭代器,这意味着一开始并不会 把整个文件读入内存。

这表明它是流式读取文件,而不是一次性读取。

TLDR io.lines() 是否有时会在内存中保存整个文件,还是一次只保存一行?它的内存使用方式是否与 while 循环中的 io:read("*line") 不同?

点赞
用户107090
用户107090

io.lines() 不会将整个文件保存在内存中:它每次读取文件的一行,而不是一次读取整个文件。如果需要一次性读取整个文件,请使用 io.read("*all")

2017-03-24 17:22:56