2016-09-05 6 views
3

DynamoDBテーブルに約20,000,000行の比較的大きなCSVファイルをロードしようとしています。しかし、約1,000,000行後にメモリダンプを取得します。NodeJsを使用してAWS DynamoDBにインポートするとメモリリークが発生する

<--- 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 

これは私のコードです。何か私にできることはありますか?

function processFile(fileName) 
{ 

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

    var lineReader = readline.createInterface({ 
    input: fs.createReadStream(fileName) 
    }); 

    var batchRecords = []; 
    lineReader.on('line', function (line) { 

    var split = line.split(','); 
    var obj = { 
     field1: split[0], 
     field2: split[1], 
     field3: split[2], 
     field4: split[3], 
     field5: split[4], 
     field6: split[5] 
    } 

    batchRecords.push(obj); 
    if (batchRecords.length == 25) { 

     var putRequests = batchRecords.map((e) => { 
     return { 
      PutRequest: { 
      Item: e 
      } 
     } 
     }); 

     var params = { 
     RequestItems: { 
      "MyTable": putRequests 
     } 
     }; 

     // Comment out this line and runs through ok 
     docClient.batchWrite(params, function (err, data) { 
     if (err) console.log(err, err.stack); 
     }); 

     batchRecords = []; 

    } 

    }); 

    lineReader.on('close', function() { 
    console.log('Done'); 
    }); 

} 

答えて

-1

プロビジョニングされた書き込みスループットを向上させましたか?

+0

はい。それが10,000であっても、それでもエラーが出ます。可能であれば、それを100,000に設定すれば動作するかもしれませんが、実行するには幸運にもなります。 – Craig

+0

DynamoDBサービスのスループットは、お使いのコンピュータのメモリとは関係ありません。 – herve

1

ファイルを正しく読み込み、行単位で20M行を挿入しようとしていないので、メモリの問題はありません。

しかし、ここで、あなたが指摘したように:

// Comment out this line and runs through ok 
     docClient.batchWrite(params, function (err, data) { 
     if (err) console.log(err, err.stack); 
     }); 

You'rはそれを使用して、コールバックでdataを参照していないし、どちらも。 Javascript GCはそれを好まない。それを削除し、それが違いを作るかどうかを確認するために試してみてください。

// Comment out this line and runs through ok 
      docClient.batchWrite(params, function (err) { 
      if (err) console.log(err, err.stack); 
      }); 

[EDIT]

[OK]を、それが最初のコールバックの外側で宣言だと、私の第二の推測がvar batchRecords = [];に関連することになるので。 最初はバッチ処理を行わないようにしてください。最適ではありませんが、コードが少なくなり、リークを見つけるチャンスが増えます。

最後に、AWS.DynamoDB.DocumentClientの内部が漏れていると推測されます。

あなたはまた、漏れを気にしないようにしたい、として、あなたのノードのプロセスをヒモことがあります。

node --max-old-space-size=8192 script.js //do not limit to default 1.4Gb but 8gb. 

私はそれをしたい気にしないだろうが、ちょっと、私はあなたをcontraintsかわかりませんがある可能性があり。

+0

ありがとうございますが、違いはありませんでした。 – Craig

関連する問題