私はノードとノンブロッキングIOパラダイム全体を使い慣れていません。私は180万行のCSVをデータベースにインポートしています。これは、CSVをより少ない行数に切り捨てると機能しますが、より多くの行数のメモリが不足しています。 ORMはsequelizeです。これはasync/promiseベースです。ここで大量のcsv行をデータベースにインポートします。
は、私のコードの簡略化抜粋です:
csv()
.from.path(thePath)
.on('record', function(row,index){
models.meshblock.findOrCreate({
where: {item_code: row[0]},
})
})
私はこの問題は、私はCSVストリーミングだと、私はより速く、彼らがすることができるよりも、これらすべての非同期データベースクエリをオフに送信してるということだと思います対処するので、メモリは解放されるよりも速く使用されます。
「この行を終了し、データベースに保存して、すべて完了してからメモリを解放してから、続行する」という方法があった場合、プロセスは非常に遅くなるはずですが、メモリを使い果たすことなく完了することができます。
私の評価は正しいですか?そして、それを回避してメモリを使い果たすことなく行をインポートするにはどうしたらいいですか?
'findOrCreate'にコールバックがありますか?もしそうなら、おそらく、あなたは 'findOrCreate'をバッチすることができるメーク・シフト・セマフォーを思いつくことができます。 – zero298
findOrCreateは約束を返します。だから、最初の1000の約束が解決されるまでCSVストリームを一時停止してから、それを続行します。先端に感謝します。 –