2017-02-16 10 views
0

Мне кажется, что у меня проблема параллелизма в nodejs. Я осознаю тот факт, что это не должно быть возможным.Nodejs filestream concurrency

Я обрабатываю данные по строке из файла и записываю ее в другой файл также в строках. В выходном файле я замечаю, что строки переписываются, что означает, что время от времени я вижу строки на выходе, которые, похоже, переписываются наполовину другими строками. Я прочитал данные из потока чтения. это выглядит примерно так:

let iStream = fs.createReadStream(inputFile); 
let oStream = fs.createWriteStream(outputFile); 
let remaining = ''; 

iStream.on('data',(data)=>{ 
    remaining += data; 
    let line = remaining.split(/\r?\n/); 
    let lines = line.length; 
    if(lines > 0) { 
    remaining = line[lines - 1]; 
    line.length = lines - 1; 
    line.forEach((curr)=>{ 
     oStream.write(processLine(curr)); 
    }); 
}); 

Есть ли возможность сбоев записи этой схемы производства или мне придется искать где-то еще?

+0

Что делает 'processLine()' do? Это полностью синхронно? FYI, вы можете упростить свой код с помощью 'остаток = line.pop()'. – jfriend00

+0

Также обратите внимание, что '.write()' возвращает boolean, который указывает, заполнен ли выходной буфер, и вам нужно дождаться, когда событие 'drain' начнет писать снова. См. [Doc] (https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback). – jfriend00

+0

Возможно, вы захотите использовать [трансформировать поток] (http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html), а затем использовать '.pipe()', который будет обрабатывать все контроль потока для вас. – jfriend00

ответ

1

Это проблема с переполнением буфера. Вероятно, вы переполняете буфер записи, но не обращаете внимания на управление потоком.

Вы можете либо передать функцию обратного вызова в .write() и только перейти к следующей записи, когда эта функция вызывается или вы можете обратить внимание на возвращаемое значение из .write(), и когда он возвращается false, вы должны затем ждать drain события в потоке, прежде чем писать еще немного.

Другим подходом было бы написать transform stream, а затем использовать .pipe() и позволить потоковой инфраструктуре управлять потоком управления для вас.

+0

Трансформатор работает как шарм и способ меньше исходного кода. Спасибо. – Thomas

 Смежные вопросы

  • Нет связанных вопросов^_^