2017-03-24 103 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