【发布时间】:2014-04-06 14:17:34
【问题描述】:
我有以下代码:
response.writeHead(200 , {
'Content-Type': 'application/vnd.ms-excel',
'Content-encoding': 'gzip',
"Content-Disposition": "attachment; filename="+getFileName()
});
var zlib = require("zlib");
var data = getData(); //some arbitrary data from a method
var outputStr = "";
var header = "some header";
var footer = "some footer";
outputStr+= header;
for(i=0;i<data.length;i++) {
outputStr+= data[i].utils.generateString(); //xml parser and various whatnots resulting in a string
}
outputStr+= footer;
zlib.gzip(outputStr, function(err, result) {
response.end(result); //works on small strings
})
有时,我的字符串长度超过了 512mb 的限制(这很好),因此,在 32 位系统上,我会得到:
FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory
我一直在阅读有关流的内容,但是所有示例都讨论了阅读文件,而不是生成的值。
如何在迭代(我的循环)期间创建流并将数据推送到其中,而不是将其全部写入字符串并将其作为响应推送。
重要的是输出将调用文件下载,就像现在一样,以及 gzip 支持(这是异步的,因此需要考虑)
【问题讨论】:
-
您将不得不放弃
zlib.gzip便利功能并使用createGzip创建一个流并将您的数据块发送给它(最好将其输出以块的形式通过管道传输到您的响应流)。 -
在传递“传输编码:分块”标头时出现问题?您能否提供一个涉及 createGzip 的示例(或指出一个示例)?谢谢
标签: node.js memory-management stream zlib