读取带有节点js和readline的大文件时,内存限制超出了错误

时间:2018-02-25 11:37:37

标签: node.js google-cloud-datastore google-cloud-functions readline

使用readline时出现内存错误。代码部分如下所示:

            var lineReader = require('readline').createInterface({
                input: require('fs').createReadStream('/tmp/temp.ttl')
            });
            let entity;
            let tripleKey;
            let triple;
            console.log('file ready for processing');
            lineReader.on('line', function (line) {
                triple = parser.parse(line)[0];
                if (triple) {
                    tripleKey = datastore.key('triple');
                    entity = prepare_entity(tripleKey, triple);
                    lineReader.pause();
                    datastore.save(entity).then(()=>lineReader.resume());                      
                    number_of_rows += 1;
            };

我认为'on'行事件的所有内存都是预先分配的,因为它在循环之外。所以我的问题是,在这部分代码中可能导致内存消耗的原因是什么?

为了回应Doug,将readline更改为完全流式传输现在显示140,000个实体之后的内存限制错误(而不是之前的40,000个实体)。

见下文:

const remoteFile = bucket.file(file.name);

var lineReader = require('readline').createInterface({
    input: remoteFile.createReadStream()
});
console.log('file ready for processing');
lineReader.on('line', function (line) { ...

1 个答案:

答案 0 :(得分:0)

在云端功能中,/tmp is a memory-based filesystem。这意味着你的1.2GB文件实际上占用了1.2GB的内存。这是很多记忆。

如果您需要更多内存,可以尝试在Cloud Console中增加功能的内存限制,最多2GB。

相反,您可能希望尝试从其来源流式传输文件并处理流而不是在本地下载整个文件。随着时间的推移,你可以节省自己的钱。