2016-04-14 2 views
1

私は存在しない文書をredisからelasticsearchにコピーする簡単なノードスクリプトを用意しています。しかし、私のスクリプトはメモリのために失敗しました。私はNode.jsに1Gのメモリの制限があることに気付きました。私はここに私の簡単なノードのスクリプトがRedisからelasticsearchへのNode.jsスクリプトのコピーがメモリ不足

'use strict'; 

const redis = require('redis'); 
const elasticsearch = require('elasticsearch'); 
const config = require('../config'); 

let client = redis.createClient({ 
    host: config.redis.url, 
    port: config.redis.port 
}); 

let esClient = elasticsearch.Client({ 
    host: config.elasticsearch.url 
}); 

client.keys('*', (err, keys) => { 
    if (err) { 
    console.log(err); 
    } 

    keys.forEach((key) => { 
    esClient.exists({ 
     index: 'articles', 
     type: 'article', 
     id: key 
    }, (err, exists) => { 
     if (!exists) { 

     } 
    }); 
    }); 

}); 

だと、これは私が得たエラーです(Redisのによる)のRedisの文書の1.7Gについて

# Memory 
used_memory:1828855608 
used_memory_human:1.70G 
used_memory_rss:1768804352 
used_memory_peak:1839670312 
used_memory_peak_human:1.71G 

を持っています。

<--- Last few GCs ---> 

    56742 ms: Scavenge 1398.8 (1457.2) -> 1398.8 (1457.2) MB, 0.8/0 ms (+ 2.2 ms in 1 steps since last GC) [allocation failure] [incremental marking delaying mark-sweep]. 
    57796 ms: Mark-sweep 1398.8 (1457.2) -> 1398.8 (1457.2) MB, 1054.1/0 ms (+ 3.2 ms in 2 steps since start of marking, biggest step 2.2 ms) [last resort gc]. 
    58835 ms: Mark-sweep 1398.8 (1457.2) -> 1398.8 (1457.2) MB, 1038.5/0 ms [last resort gc]. 


<--- JS stacktrace ---> 

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

Security context: 0x220f52737399 <JS Object> 
    1: test [native regexp.js:~132] [pc=0x2b04c4f8bd00] (this=0xdea7c8c02e9 <JS RegExp>,k=0xdea7c8b0741 <String[24]: /articles/article/1HcdBc>) 
    2: new constructor(aka ClientRequest) [_http_client.js:~19] [pc=0x2b04c4fa5ebd] (this=0xdea7c8c0459 <a ClientRequest with map 0x11d7d52ec4f1>,options=0xdea7c8c0409 <an Object with map 0x11d7d52f6731>,cb=0xdea7c8c03c1 <JS Function (SharedFunctionInfo... 

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory 
sh: line 1: 96220 Abort trap: 6   node scripts/copy-to-es.js 

しかし、Redisをからの1.7Gは、文書の全体はあるが、私はちょうどそれがElasticsearchにか存在する場合、すべてのキーをチェックするためになったと思いました。記憶のせいでそれがなぜ失敗したのか分かりませんし、どうやってこれを克服しますか?私はノード4.2.2を使用しています

答えて

0

elasticsearchクライアントが原因である可能性があります。あなたが持っている問題を記述したバグレポートがあります。 elasticsearchクライアントのどのリリースを使用していますか?

https://github.com/elastic/elasticsearch-js/issues/310

+0

私は10.1.3を使用しています – toy

0

それは1つまたは2つのES呼び出しだ場合、私の代わりにelasticsearchモジュールを使用してのESに(要求またはたSuperAgentと)、プレーンHTTPリクエストを使用して試してみた...

しかし、Iあなたのコードは一度にそれらのすべてをメモリにロードします...