Node.js: обработка потока без нехватки памяти

Я пытаюсь прочитать гигантский файл журнала (250 000 строк), анализируя каждую строку в объект JSON и вставляя каждый объект JSON в CouchDB для аналитики.

Я пытаюсь сделать это, создав буферизованный поток, который будет обрабатывать каждый фрагмент отдельно, но мне всегда не хватает памяти примерно после 300 строк. Похоже на использование буферизованных потоков и util.pump должен избегать этого, но, по-видимому, нет.

(Возможно, для этого есть лучшие инструменты, чем node.js и CouchDB, но мне интересно узнать, как выполнять такую ​​​​обработку файлов в node.js, и я думаю, что это должно быть возможно.)

CoffeeScript ниже, JavaScript здесь: https://gist.github.com/5a89d3590f0a9ca62a23

fs = require 'fs'
util = require('util')
BufferStream = require('bufferstream')

files = [
  "logfile1",
]

files.forEach (file)->
  stream = new BufferStream({encoding:'utf8', size:'flexible'})
  stream.split("\n")
  stream.on("split", (chunk, token)->
    line = chunk.toString()
    # parse line into JSON and insert in database
  )
  util.pump(fs.createReadStream(file, {encoding: 'utf8'}), stream)

person user225643    schedule 06.07.2012    source источник
comment
Вы должны иметь возможность использовать поток для передачи файла вам. В событиях «данных» вы можете приостановить поток, а затем разделить каждый фрагмент на \n. Оставьте последний элемент в разбиении для следующего фрагмента, если он не заканчивается на \n. Обязательно обработайте оставшуюся часть при запуске конечного события. Использование bufferstream приведет к нехватке памяти, и вы, по сути, переместите файл в массив буферов в памяти. Также следует использовать stream.pipe() вместо util.pump().   -  person Ryan Olds    schedule 07.07.2012
comment
Я бы рекомендовал использовать fs.createReadStream() — nodejs.org/api/fs.html#fs_fs_createreadstream_path_options< /а>   -  person Ryan Olds    schedule 07.07.2012


Ответы (1)