現在、ノードJSとJavascriptを学習中です。私はマンガを読んでダウンロードするアプリケーションを開発しようとしています。致命的なエラー:CALL_AND_RETRY_LAST割り当てに失敗しました - Javacriptヒープメモリ不足
まず、データベースを構築したいと思います。ここで私は問題に遭遇します。 私は4GBのRAM(私のDBを埋めるために)を持って私のサーバー上で私のプログラムを実行すると、メモリから致命的なエラーJavascriptのヒープを取得します。
8GBのRAMを搭載したローカルコンピュータで同じプログラムを実行すると、すべてが正常に動作します。
ここで私は漫画の章で私のDBを埋めるコードです。
function insertChapters(callback){
sql_selectAll("Mangas", function (selectError, selectResult) {
if(!selectError){
selectResult.forEach(function (mangaItem, mangaIndex) {
gin.mangafox.chapters(mangaItem.Title)
.then(chapters =>{
chapters.forEach(function (chapterItem) {
var Chapter = {
Title: chapterItem.name,
NR: chapterItem.chap_number,
URL: chapterItem.src,
MangaID: mangaItem.MangaID,
MangaName: mangaItem.Title,
VolumeNR: chapterItem.volume
};
sql_insertInto("Chapters", Chapter, function (insertError, insertResult) {
if(!insertError){
var insertedChapter =
"------------------------------------------------------------------------\n" +
" Added new Chapter: " + Chapter.NR + " For: " + mangaItem.Title + "\n" +
"------------------------------------------------------------------------\n";
callback(null,insertedChapter ,insertResult);
}
else{
if(insertError.code === "ER_DUP_ENTRY") {
var dupEntry = "------------------------------------------------------------------------\n" +
" Duplicate Entry: Chapter: " + Chapter.NR + " For: " + mangaItem.Title + "\n" +
"------------------------------------------------------------------------\n"
callback(null, dupEntry, null);
}
else{
callback(insertError, null, null);
}
}
})
})
})
.catch(fetchChapterError => {
callback(fetchChapterError, null, null);
})
})
}
else{
callback(selectError, null, null);
}
});
}`
私は問題が何であるかイムわからないので、実際に、この問題を解決する方法を知らない:
- は、私は自分のサーバーに十分なRAMを持っていけない単にという問題ですか?
- 私のコードに問題はありますか?私はどこかに記憶を漏らしていますか?
- 私のコードでメモリが大量に必要なことはありますか?
ありがとうございます。私が得ることができるすべてのヘルプに感謝します。
EDIT:
function sql_selectAll(tableName, callback){
var sql = 'SELECT * FROM `' + tableName + '`';
connection.query(sql, function (err, selectAllResult) {
callback(err, selectAllResult);
})
}
function sql_insertInto(tableName, insertionObject, callback) {
var sql = 'insert into ' + tableName + ' set ?';
connection.query(sql, insertionObject, function (err, insertResult) {
callback(err, insertResult);
});
}
最初のSQLクエリで返される結果の数はいくつですか?また、SQLのすべての結果に対してただちに 'gin.mangafox.chapters'エンドポイントを呼び出して、すべての結果が戻ってくるのを待っていることに注意することが重要です。JSでの非同期プログラミングがどのように機能するのですか?非同期呼び出しが待機している間、コードは実行され続けます。 'forEach'を呼び出すと、コール間で非同期の結果が返ってくるのを待つことなく、すべての項目に対して指定された関数がすぐに実行されます。あなたのDBに何百ものマンガがあるなら、同時に何百ものAPIコールをやっています。 – sbking
初期クエリでは約19.000の結果が返され、これらの19.000の平均値は15-20の章があります。 もっとメモリに優しいアプローチがありますか?私はまだ非同期プログラミングの周りに頭を抱えようとしています。 ありがとうございました。 – calgara12
はい、managafox APIエンドポイント*への19000リクエストを同時に行っています。プログラムは一度に1つずつ、またはチャンクではなく、あまりに多くの非同期要求を追跡しようとしているため、メモリが不足しています。 JSの非同期/待機機能を調べましたか?また、SQL呼び出しには何を使用していますか?私は 'sql_selectAll'や' sql_insertInto'のようなメソッドを認識しません。これらのメソッドが約束を返すならば、async/awaitを使って関数をどのように構造化できるかを示すことができます。 – sbking