2017-10-10 5 views
0

は、私は私のコレクションに「いくつかの」文書を挿入しようと、このコードでは、このサンプルJavaScriptのヒープは

export let index = (req: Request, res: Response) => { 


for (let i = 0; i < 10; i++) { 
    let bulk = Faker.collection.initializeUnorderedBulkOp(); 
    for (let y = 0; y < 200000; y++) { 
     bulk.insert({ 
      name: randomName(), 
      nights: Math.random(), 
      price: Math.random(), 
      type1: Math.random(), 
      type2: Math.random(), 
      type3: Math.random(), 
      type4: Math.random(), 
      departure: mongoose.Types.ObjectId(randomAreaID()), 
      destination: mongoose.Types.ObjectId(randomAreaID()), 
      refundable: randomBool(), 
      active: randomBool(), 
      date_start: randomDate(), 
      date_end: randomDate(), 
     }); 
    } 
    bulk.execute(); 
} 


return res.json({data: true}); 

}; 

を見てみましょう挿入します。

は私がinitializeUnorderedBulkOpを使用しますが、私は100万人以上のドキュメントを保存しようとするならば、私はメモリを増やすことができることを知っているメモリの問題

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 

を持っているが、私はよりよい解決策を見つけたいです。今は2mのレコードが必要ですが、将来は100mが必要になります。

メモリの問題を避けるための提案はありますか?

+0

一度に20万レコードを挿入できる特別な理由はありますか?このスケールでは、ユーザーを吊り下げることなく、管理可能なチャンクでそれを突き抜けることができるバックグラウンドプロセッサーにプッシュする方が良いでしょうか? – Stephen

+0

私のアプリケーションでは、これらは200万の "パッケージ"を作成する必要があります...そうです...ある理由があります。時には2m以上の組み合わせがあります。 私はバックグラウンドに送信する場合、私は同じメモリの問題があります。だからまず第一に私はこの問題を解決したい。私はそれをチャンクに分割する場合、PHPでそれは同期操作であるため問題はありません – Michalis

答えて

0

Async/Awaitが解決策です。メモリが不足している200.000.000文書。無制限は今限界です....

let bulkPromise = (data) => { 
return new Promise((resolve, reject) => { 
    if (data.length > 0) { 
     let bulk = Faker.collection.initializeUnorderedBulkOp(); 
     data.forEach((d) => { 
      bulk.insert(d); 
     }) 
     bulk.execute(() => { 
      resolve(true); 
     }); 
    } else { 
     resolve(false); 
    } 
}); 
} 

export let index = async (req: Request, res: Response) => { 

for (let i = 0; i < 100; i++) { 
    let data = []; 
    for (let y = 0; y < 200000; y++) { 
     data.push({ 
      name: randomName(), 
      nights: Math.random(), 
      price: Math.random(), 
      type1: Math.random(), 
      type2: Math.random(), 
      type3: Math.random(), 
      type4: Math.random(), 
      departure: mongoose.Types.ObjectId(randomAreaID()), 
      destination: mongoose.Types.ObjectId(randomAreaID()), 
      refundable: randomBool(), 
      active: randomBool(), 
      date_start: randomDate(), 
      date_end: randomDate(), 
     }); 
    } 
    await bulkPromise(data).then((data) => { 
     console.log(i); 
    }); 

} 

return res.json({data: true}); 


};