Writing large files with Node.js

后端 未结 7 844
走了就别回头了
走了就别回头了 2020-12-08 06:53

I\'m writing a large file with node.js using a writable stream:

var fs     = require(\'fs\');
var stream = fs.createWriteStream(\'someFile.txt\', { flags : \         


        
7条回答
  •  北海茫月
    2020-12-08 07:48

    The idea behind drain is that you would use it to test here:

    var fs = require('fs');
    var stream = fs.createWriteStream('someFile.txt', {flags: 'w'});
    
    var lines;
    while (lines = getLines()) {
        for (var i = 0; i < lines.length; i++) {
            stream.write(lines[i]); //<-- the place to test
        }
    }
    

    which you're not. So you would need to rearchitect to make it "reentrant".

    var fs = require('fs');
    var stream = fs.createWriteStream('someFile.txt', {flags: 'w'});
    
    var lines;
    while (lines = getLines()) {
        for (var i = 0; i < lines.length; i++) {
            var written = stream.write(lines[i]); //<-- the place to test
            if (!written){
               //do something here to wait till you can safely write again
               //this means prepare a buffer and wait till you can come back to finish
               //  lines[i] -> remainder
            }
        }
    }
    

    However, does this mean that you need to keep buffering getLines as well while you wait?

    var fs = require('fs');
    var stream = fs.createWriteStream('someFile.txt', {flags: 'w'});
    
    var lines,
        buffer = {
         remainingLines = []
        };
    while (lines = getLines()) {
        for (var i = 0; i < lines.length; i++) {
            var written = stream.write(lines[i]); //<-- the place to test
            if (!written){
               //do something here to wait till you can safely write again
               //this means prepare a buffer and wait till you can come back to finish
               //  lines[i] -> remainder
               buffer.remainingLines = lines.slice(i);
               break;
               //notice there's no way to re-run this once we leave here.
            }
        }
    }
    
    stream.on('drain',function(){
      if (buffer.remainingLines.length){
        for (var i = 0; i < buffer.remainingLines.length; i++) {
          var written = stream.write(buffer.remainingLines[i]); //<-- the place to test
          if (!written){
           //do something here to wait till you can safely write again
           //this means prepare a buffer and wait till you can come back to finish
           //  lines[i] -> remainder
           buffer.remainingLines = lines.slice(i);
          }
        }
      }
    });
    

提交回复
热议问题