带有

时间:2017-11-13 02:40:10

标签: node.js memory memory-leaks amazon-dynamodb

现在我在文档客户端上使用Dynamodb的put方法存在这个问题。当我运行我的程序时,put方法被注释掉,内存从70MB开始,跳到90MB,然后继续稳定到大约65MB。没有注释掉我的程序的内存,跳到90MB并且不断增长。

var params;

for (var i = 0; i < tuples.length; i++){
    if(tuples[i][1] != ""){
        params = {
            TableName: "wordTable2",
                Item:{
                    "word":tuples[i][1],
                    "url":tuples[i][0],
                    "info":tuples[i][2]
                }
            };

        var dynamobd = new AWS.DynamoDB.DocumentClient();
        dynamobd.put(params, function(err, data){
            //if(err) console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
            //else    console.log("Added item:", JSON.stringify(data, null, 2));
        });
        dynamobd = null;
        delete dynamobd;
    }
    //console.log(tuples[i][0] + " " + tuples[i][1] + " " + tuples[i][2]);
}
delete params;
delete bodyText;
delete holder;
delete tuples;

我不知道如何制作一个有效的循环来将所有项目添加到parmas上。如果我能做到这一点,我只需要为每个URL发送一个put方法,而不是每个可能有帮助的单词。我还尝试在参数中加入多个项目,多达10个,但这似乎没什么区别。

完整代码转到 https://pastebin.com/iQ1h0jjN

2 个答案:

答案 0 :(得分:0)

它可能与在循环中实例化AWS.DynamoDB.DocumentClient()有关。尝试移动for循环之外 - 正好在var params;之下,应该没问题。 (显然也删除了两行nulling并删除了dynamodb对象)

如果这没有帮助,请查看DynamoDB batchWriteItem方法。听起来你可能会从这种方法中受益。

答案 1 :(得分:0)

我没有任何问题地使用DynamoDB api,但是在我的代码中,John Veldboom提到的内容是你正在进行的内存管理。我要做的第一件事是尽早声明并初始化您的DynamoDB客户端,而不是再次。它只是一个HTTP休息客户端。您可以将其与其他require('.....')依赖项

一起设置一次

我还会将所有删除命令和变量赋值删除为null。你的for循环在它遍历每个命令时完成,但不一定在每个DynamoDB返回后,因为这些回调是异步触发的。

var dynamobd = new AWS.DynamoDB.DocumentClient();

var params;

for (var i = 0; i < tuples.length; i++){
    if(tuples[i][1] != ""){
        params = {
            TableName: "wordTable2",
                Item:{
                    "word":tuples[i][1],
                    "url":tuples[i][0],
                    "info":tuples[i][2]
                }
            };

        dynamobd.put(params, function(err, data){
            if(err) console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
            else    console.log("Added item:", JSON.stringify(data, null, 2));
        });
    }
    console.log(tuples[i][0] + " " + tuples[i][1] + " " + tuples[i][2]);
}
//Your for loop is done but that does not mean all the DynamoDB callbacks have returned yet.