【发布时间】:2018-02-25 11:37:36
【问题描述】:
使用 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;
};
我认为“在线”事件的所有内存都是预先分配的,因为它在循环之外。所以我的问题是,什么可能导致本节代码中的内存消耗?
作为对 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) { ...
【问题讨论】:
-
你是如何创建 readline 界面的?
-
添加了创建linereader界面的sn-p
-
该文件有多大?
prepare_entity做了什么并返回?什么是datastore(它是内存中的东西)?你怎么知道/怀疑readline内存不足?我的赌注是datastore.save。旁注:注意let的点正是它在块级别上的作用域——在块之外预先声明实体、tripleKey 和triple 会破坏这个细节,也会使代码更长。 -
文件为1.2G。 Datastore 是谷歌云产品。 prepare_entity 提供一个包含三键和三个字符串的字典。
标签: node.js google-cloud-datastore google-cloud-functions readline