使用NodeJ导入AWS DynamoDB会导致内存泄漏

时间:2016-09-05 04:29:26

标签: node.js amazon-dynamodb aws-sdk

我正在尝试将大约20,000,000行的相对较大的CSV文件加载到DynamoDB表中。但是在大约1,000,000行之后我得到了内存转储

 $(".cat").click(function() {
     $(this).toggleClass('red black');
 });

这是我的代码。我有什么可以做的吗?

<--- Last few GCs --->

  136289 ms: Scavenge 1397.5 (1457.9) -> 1397.5 (1457.9) MB, 0.3 / 0 ms (+ 0.0 ms in 1 steps since last GC) [allocation failure] [incremental marking delaying mark-sweep].
  137127 ms: Mark-sweep 1397.5 (1457.9) -> 1397.5 (1457.9) MB, 841.8 / 0 ms (+ 0.0 ms in 1 steps since start of marking, biggest step 0.0 ms) [last resort gc].
  137989 ms: Mark-sweep 1397.5 (1457.9) -> 1397.5 (1457.9) MB, 858.6 / 0 ms [last resort gc].

<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0000009B9BAB4639 <JS Object>
    1: stringify [native json.js:157] [pc=000003139D3AB8C4] (this=0000009B9BAAE771 <a JSON with map 0000004A38909B69>,u=0000009B9BAD8B09 <an Object with map 000001D75FD60619>,v=0000009B9BA041B9 <undefined>,I=0000009B9BA041B9 <undefined>)
    2: arguments adaptor frame: 1->3
    3: buildRequest [c:\Workspace\Archive\node_modules\aws-sdk\lib\protocol\json.js:~5] [pc=000003139D345857] (this=0000...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

2 个答案:

答案 0 :(得分:1)

你正确地读取文件,不是试图在内存中插入20M行,所以这里没有内存问题。

但是,正如你所指出的那样:

unsigned volatile int static const long a;

您在回调中引用 // Comment out this line and runs through ok docClient.batchWrite(params, function (err, data) { if (err) console.log(err, err.stack); }); 并且都没有使用它。 Javascript GC不喜欢这样。尝试删除它,看看它是否有任何区别:

data

<强> [编辑]

好的,所以我的第二个猜测与// Comment out this line and runs through ok docClient.batchWrite(params, function (err) { if (err) console.log(err, err.stack); }); 有关,因为它是在第一个回调之外声明的。 尽量不要先批量处理,但这不是最优的,但会有更少的代码,所以更有可能找到泄漏。

我的最后一个猜测是内部var batchRecords = [];正在泄漏。

您可能还想关注泄漏,并使用以下命令对您的节点进程进行处理:

AWS.DynamoDB.DocumentClient

我会关心而不喜欢这样做,但是,嘿,我不知道你可能有什么样的约束。

答案 1 :(得分:-1)

您是否增加了预配置的写入吞吐量?