2016-08-11 12 views
0

私はノードとノンブロッキング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ストリーミングだと、私はより速く、彼らがすることができるよりも、これらすべての非同期データベースクエリをオフに送信してるということだと思います対処するので、メモリは解放されるよりも速く使用されます。

「この行を終了し、データベースに保存して、すべて完了してからメモリを解放してから、続行する」という方法があった場合、プロセスは非常に遅くなるはずですが、メモリを使い果たすことなく完了することができます。

私の評価は正しいですか?そして、それを回避してメモリを使い果たすことなく行をインポートするにはどうしたらいいですか?

+0

'findOrCreate'にコールバックがありますか?もしそうなら、おそらく、あなたは 'findOrCreate'をバッチすることができるメーク・シフト・セマフォーを思いつくことができます。 – zero298

+0

findOrCreateは約束を返します。だから、最初の1000の約束が解決されるまでCSVストリームを一時停止してから、それを続行します。先端に感謝します。 –

答えて

0

おそらく最も効率的な方法は、データベース固有のメカニズムを使用することです。例:

+0

残念ながら、各行で何らかのビジネスロジックを実行する必要があるため、それほど単純ではありません。 –

関連する問題