节点JS块文件读取为一个文件没有中断?

时间:2017-01-08 21:18:28

标签: javascript node.js

我成功读取m3u8并提取ts文件并读取m3u8并检查是否写入了新索引(ts文件)然后使用

res.write(chunk);

我得到流而不打断..正在按照m3u8文件中定义的顺序读取文件并且所有工作都完美无缺...但我有一个巨大的问题...使用res.write我即时获取我的块文件从HDD读取到RAM,RAM使用量每秒增加1MB所以在大约一个小时内我将进入内存不足...所以问题是如何从RAM中删除previus读取ts文件以便内存使用将一直都一样吗?

我看到res.write正在写入内存,但是没有从内存中删除旧数据......这种方式不实用并且会出现内存错误。可以使用res.write缓冲区大小,这样当缓冲区大小时是否已完全自动从内存中删除并将下一个块数据读入RAM?

以下是代码:

fs.readFile('/tmp/files/'+ts[ts.length-2], function (err, data ) {
    res.write(data);
    /* HERE I NEED TO CLEAR DATA BUFFER CHUNK FROM MEMORY */
});

所以我在循环(小块)中读取1000个文件并将其写入响应客户端......这种方法非常好而不会中断...但内存使用情况是在HDD上读取文件大小因此RAM使用量正在增长...我可以在将数据发送到客户端后从内存中删除数据吗?

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方案..我只需要在节点上运行我的test.js时添加:

node --expose-gc test.js

在从HDD上的文件读取流之前,我添加了:

global.gc();

这样global.gc();当运行时释放从函数fs.filereadsync读取的所有内存...所以我的代码如下所示:

global.gc();
fs.readFile('/tmp/files/'+ts[ts.length-2], function (err, data ) {
   res.write(data);

});

这种方式......启动节点js时的RAM使用情况始终是相同的...它不依赖于文件块的大小...它将大文件读取到内存中......当再次调用此函数时它释放ram以启动状态并在RAM上读取另一个块文件,因此循环...