我们有一些数据库调用可以轻松地传输10万条记录。我们面临的问题是,每当我们使用这些流之一时,它就会挂住CPU,并且似乎阻塞了所有其他进程。

我尝试了几种不同的技巧来减轻这种情况,但是现在有点卡住了。这是我最近一次尝试将流传输到使用process.nextTick的Transform的尝试。

var stream = require('stream');
var util   = require('util');

function StreamThrottler() {
  stream.Transform.call(this, { objectMode: true });
}

util.inherits(StreamThrottler, stream.Transform);

StreamThrottler.prototype._transform = function(chunk, encoding, cb) {

  process.nextTick(function() {
      console.log('chunk');
      // note: I'm intentionally not pushing the chunk
      // onto the stream for testing
      cb();
  });
};

StreamThrottler.prototype._flush = function(cb) {
  cb();
};

var streamThrottler = new StreamThrottler();

// now the db call
this.largeDatabaseResultStream().pipe(streamThrottler);

我注意到this Node.js问题可能相关,也可能不相关。

是否有人对如何解决这个问题有其他想法?

最佳答案

当您使用objectMode: true时, native 流实现可能必须缓冲和序列化数据。

因此,使用节流器流的想法是一个好主意,因此也许此流将使用objectMode: false和下行流,您可以使用方便的objectMode: true

请注意,混合不同种类的流可能会给您带来一些错误。{objectMode: false} ==> {objectMode: true}可以(缓冲区只是另一种对象){objectMode: true} ==> {objectMode: false}不合适(除非数据本身是缓冲区)

关于javascript - Node.js-很大的流正在阻塞并且占用大量CPU,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23502586/

10-09 22:10