2017-08-24 25 views
0

こんにちは私は巨大なデータをインポートしようとしています。その8GBの周りに53k個のファイルがあります。 私が望むのは、一度に1つのファイルをインポートし、その使い方で完了してから、キャッシュを削除/削除またはガベージコレクトします。ローカル変数の値を使用後にクリア/ガベージコレクションする方法

deleteキーワードを使用すると、objインスタンスの参照のみが削除されることがわかります。削除または変数値をnullまたはundefinedに設定しても機能しません。

ここに私のコードです。

fs.readdir(dirname, (err, filenames) => { 
    if (err) { 
     onError(err); 
     return; 
    } 
    _.forEach(filenames, (file) => { 
     if (!!~file.indexOf('.json')) { 
      this.synchronize(() => { 
       let currentFile = require(`${dirname}${file}`); 
       return new Promise((resolve, reject) => { 
        setTimeout(() => { 
         //assume am done working with the data imported in variable currentFile here. now i want to delete it. 
         resolve('Done'); 
        }, 1) 
       }) 
      }) 
     } 

    }); 
}); 

キャッシュを空にするには成功していない可能性があります。 currentFileを処理した後にそれをクリアする方法はありますか?

また、フォルダ内の任意の数のファイルに対して機能するようにコードを調整する方法があります。

任意のヘルプは、私はあなたのコードを持つ2つの大きな問題を参照してください

+0

グローバルモジュールキャッシュを使用する 'require'の代わりに' JSON.parse(fs.readFile(...)) 'を使ってみてください。またはキャッシュをクリアする - 重複した質問を参照してください。 – Bergi

答えて

1

を理解されるであろう。

  1. requireは大丈夫だが、主な問題はあるJSONファイルをロードすることが可能であること、それは同期ので、それをやっていますあなたは適切にnode.js非同期の性質を使用することはできません。なぜなら、動的ファイルにはrequireを使用することをお勧めしません。requireは、アプリケーション初期化のためのもので、内部ではキャッシュメカニズムを使用しないため、アプリケーションが遅くなります。
  2. この方法ですべてのファイルをロードして処理することは、非常にリソースを消費します。stream apiを使用してアーキテクチャをリファクタリングする必要があります。ストリームが輝くユースケースです。

    1. JSONStream NPMモジュール
    2. fs.createReadStreamアイデアは、以上のすべての反復処理することです

    モジュールfsから:

あなたの問題を解決する方法は、リソースに次に飛び込むことですあなたが既にやっているディレクトリ内のファイルを作成してから、各ファイルの読み込みストリームを作成してから、この方法でパイプJSONStream.parseを得る膨大な量のメモリ。

+1

答えをありがとう。あなたの提案でコードをリファクタリングします。 –

+1

ありがとう、 'fs.createReadStream'は彼の魔法を示しています。 –

+0

@FaheemAlamを助けてくれること –

0

オブジェクトを解放するようにガベージコレクタに明示的に指示することはできません。ガベージコレクタがオブジェクトへの参照がなくなるとすぐにオブジェクトが破棄されます。そのためには、オブジェクトへのすべての参照が削除されていることを確認する必要があります。少なくとも1つの参照がある限り、オブジェクトはメモリ内にとどまります。

約束を解決する瞬間、currentFileはもはや参照されず、最終的にガベージコレクションされます。

+0

答えをありがとうが、何らかの理由でcurrentFileにGCがありません。 –

+0

わかりません。 GCは 'currentFile'の世話をします、なぜそれをしないのですか? – PeterMader

+0

私は、問題をrequireを使用してファイルをインポートすることと考えています。 readSteamは魔法を示します。助けてくれてありがとう –

関連する問題