如何使用内存中的DB流式传输响应?
我使用Loki JS作为内存DB。有一个特定的资源,我必须返回表的全部内容(不能分页),这个表可以增长到大约500,000个项目,大约300mb。
在其他情况下,我使用fs.createReadStream获取文件并将其流回给用户:
fs.createReadStream('zips.json')
.on('data', function() {
res.write(...)
})
.on('end', function() {
res.end();
})
这对于大文件非常有效,但是我如何使用内存中的DB来做一些等效的事情呢?
const items = lokiDb.addCollection('items');
items.insert('a bunch of items ...');
// I would now like to stream items via res.write
res.write(items)
目前,res.write(items)
会导致内存问题,因为Node试图一次返回整个响应。
发布于 2017-10-23 21:53:15
据我所知,在Loki中没有本地流提供程序,尽管我可能错过了它。您可能想要做的是监听集合上的'insert‘事件,并编写该事件,如下所示:
const items = lokiDb.addCollection('items');
items.on('insert', (results) => {
res.write(results);
});
items.insert('a bunch of items ...');
发布于 2017-10-26 19:47:47
如果我是正确的,基本上您的问题是readStreams只从文件中读取,而您希望从内存中的数据结构中读取。一个解决方案可能是定义您自己的readStream类,稍微修改一下原型stream.Readable._read方法:
var util = require('util');
var stream = require('stream');
"use strict";
var begin=0, end=0;
var options = {
highWaterMark: 16384,
encoding: null,
objectMode: false
};
util.inherits(InMemoryStream, stream.Readable);
function InMemoryStream(userDefinedOptions, resource){
if (userDefinedOptions){
for (var key in userDefinedOptions){
options.key = userDefinedOptions[key];
}
}
this.resource = resource;
stream.Readable.call(this, options);
}
InMemoryStream.prototype._read = function(size){
end += size;
this.push(this.resource.slice(begin, end));
begin += size;
}
exports.InMemoryStream = InMemoryStream;
exports.readStream = function(UserDefinedOptions, resource){
return new InMemoryStream(UserDefinedOptions, resource);
}
将内存中的数据结构(在下面的示例中是一个数组)转换为readStream,并通过管道将其传递给writeStream,如下所示:
"use strict";
var fs = require('fs');
var InMemoryStream = require('/home/regular/javascript/poc/inmemorystream.js');
var stored=[], writestream, config={};
config = {
encoding: null,
fileToRead: 'raphael.js',
fileToWrite: 'secondraphael.js'
}
fs.readFile(config.fileToRead, function(err, data){
if (err) return console.log('Error when opening file', err);
stored = data;
var inMemoryStream = InMemoryStream.readStream({encoding: config.encoding}, stored);
writestream = fs.createWriteStream(config.fileToWrite);
inMemoryStream.pipe(writestream);
inMemoryStream.on('error', function(err){
console.log('in memory stream error', err);
});
});
https://stackoverflow.com/questions/46890142
复制相似问题