2017-01-02 8 views
6
私はファイルを扱うプログラムで働いている

、私はそれを初期化しています取引RAM

今日など、それらの名前を変更するようないくつかのことを行うそれらの内容を読み取ることができます次のように:

return new Promise((resolve, reject) => { 
    glob("path/for/files/**/*", { 
    nodir: true 
    }, (error, files) => { 
    files = files.map((file) => { 
     // properties like full name, basename, extension, etc. 
    }); 
    resolve(files); 
    }); 
}); 

をだから、私は、アレイ内のすべてのファイルを返し、特定のディレクトリの内容を読み、その配列を反復処理し、プロパティを持つオブジェクトのパスを変更するArray.mapを使用しています。

時々私は200.000のテキストファイルを扱うことがあるので、RAMが多すぎるので問題になっています。

だから、私は怠惰な読み込みで構築関数に置き換えたいですが、私は前にそれをしたことがないので...私は助けの手を探しています。

私のコードです:

class File { 
    constructor(path) { 
    this.path = path; 
    } 

    extension() { 
    return path.extname(this.path); 
    } 
    // etc 
} 

だから、私のメインの質問です:私は性の評価を返さなければならない、または私はそれを交換する必要がありますか?このように:

extension() { 
    this.extension = path.extname(this.path); 
} 

私はこれがトレードオフであることを理解しています。私はCPU使用量によってメモリを交換するつもりです。

ありがとうございます。

+0

どのクラスを使用して*いない*についてのでしょうか?単純なオブジェクトにファイルデータを保存できませんか? – MaxArt

+0

私はファイルをオブジェクトの配列に格納していますが、オブジェクトはどれですか。私はメモリ使用量を改善するためにクラスを変更したい。 –

+0

@FXAMNなぜクラスがメモリ使用量を減らすと思いますか? – Raito

答えて

0

あなたはRAMの使用量を削減したい場合は、私は次のように、各パスのための余分なメタデータファイルを保存するお勧め:

  1. は、必要に応じて、メモリ内のパスを保持し、またはそれらのいくつか。

  2. 保存ファイルのプロパティのハードドライブに

files.forEach((file) => { 
    // collect the properties you want for the file 
    // ... 
    var json = { path: file, extension: extension, .. } 

    // mark the metadata file so you can access it later, for example: put it in the same path with a suffix 
    var metaFile = path + '_meta.json'; 
    fs.writeFile(metaFile, JSON.stringify(json), (err) => { 
    if (err) throw err; 
    }); 
});

今、すべてのメタデータは、ハードドライブ上にあります。この方法では、ディスクスペースとCPUコールのためにメモリを交換すると思います。

  1. ファイルのプロパティを取得する場合は、JSON.parseの対応するメタデータファイルを読んでください。
0

CPUを交換する理由はありません。ツリーを歩いて見つかったファイルを処理するだけです。ツリーを歩くために必要なスペースは、深さが最初に行われた場合はツリーの深さに比例します。これは、既存のコードにパスのリストを作成することとほぼ同じオーバーヘッドです。

ディレクトリウォーキングの場合、node.js FAQnode-finditを推奨します。そこにあるドキュメントはかなり明確です。あなたのコードは次のようになります:

var finder = require('findit')(root_directory); 
var path = require('path'); 
var basenames = []; 

finder.on('file', function (file, stat) { 
    basenames.push(path.basename(file)); 
    // etc 
} 

または、必要に応じてキャプチャされた値をオブジェクトにラップできます。

0

パスプロパティNodeJSクラスインスタンスのみを保存する場合は、たとえば200k * (path.length * 2 + 6)バイトのメモリを使用します。

あなたがベース名のための遅延ロードを使用する場合は、extenstionsなどが怠惰なゲッター

class File { 
    constructor(path) { 
    this.path = path; 
    this._basename = null; 
    this._extname = null; 
    } 
    get extname() { 
    return this._extname || (this._extname = path.extname(this.path)); 
    } 
    get basename() { 
    return this._basename || (this._basename = path.basename(this.path)); 
    } 
}