Вот довольно эффективный подход:
eachLineIn = (filePath, func) ->
blockSize = 4096
buffer = new Buffer(blockSize)
fd = fs.openSync filePath, 'r'
lastLine = ''
callback = (err, bytesRead) ->
throw err if err
if bytesRead is blockSize
fs.read fd, buffer, 0, blockSize, null, callback
lines = buffer.toString('utf8', 0, bytesRead).split '\n'
lines[0] = lastLine + lines[0]
[completeLines..., lastLine] = lines
func(line) for line in completeLines
return
fs.read fd, buffer, 0, blockSize, 0, callback
return
Вы должны сравнить это на своем оборудовании и ОС, чтобы найти оптимальное значение blockSize
для больших файлов.
Обратите внимание, что это предполагаетстроки этого файла делятся только на \n
.Если вы не уверены, что используют ваши файлы, вы должны использовать регулярное выражение для split
, например:
.split(/(\\r\\n)|\\r|\\n/)