通过CPU交易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迭代数组并更改具有属性的对象的path。

有时候我用200.000个文本文件工作,所以这成为一个问题,因为它消耗了太多的RAM。

所以,我想用一个懒惰加载的构造函数replace..但我从来没有这样做过…所以我正在寻找一个帮助的手。

这是我的代码:

 class File { constructor(path) { this.path = path; } extension() { return path.extname(this.path); } // etc } 

所以,我的主要问题是:我应该只返回财产评估,还是应该replace? 喜欢这个:

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

我明白这是一个权衡..我要通过CPU使用交易的内存。

谢谢。

如果你想减lessRAM的使用,我build议你为每个path存储一个额外的元数据文件,如下所示:

  1. 将path保留在内存中,或根据需要保留其中的一些path。

  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其对应的元数据文件。

没有理由把CPU换成空间。 只要走过树并处理find的文件。 行走树所需的空间与树深度成比例,如果深度先行。 这几乎可以肯定和现有代码中创buildpath列表相同。

对于目录行走, node.js FAQbuild议node-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 } 

或者,如果你喜欢,你可以将捕获的值包装在一个对象中。

如果你只存储path属性的NodeJS类实例,请为你的例子200k * (path.length * 2 + 6)字节的内存。

如果你想使用延迟加载基本名称,扩展等使用懒惰的getter

 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)); } }