按CPU交易RAM(性能问题)

6 javascript cpu ram node.js

我正在处理一个处理文件的程序,我可以做几件事,比如重命名它们,读取它们的内容等等.

今天我正在初始化它如下:

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);
  });
});
Run Code Online (Sandbox Code Playgroud)

因此,我读取特定目录的内容,返回数组中的所有文件,然后使用Array.map迭代数组并更改具有属性的对象的路径.

有时我使用200.000文本文件,因此,这成为一个问题,因为它消耗了太多的RAM.

所以,我希望用延迟加载替换构造函数..但我之前从未这样做过......所以我正在寻找帮助之手.

那是我的代码:

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

  extension() {
    return path.extname(this.path);
  }
  // etc
}
Run Code Online (Sandbox Code Playgroud)

所以,我的主要问题是:我应该只返回属性的评估,还是应该替换它?像这样:

extension() {
  this.extension = path.extname(this.path);
}
Run Code Online (Sandbox Code Playgroud)

我知道这是一个折衷..我将通过CPU使用来交换内存.

谢谢.

rem*_*tec 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;
  }); 
});
Run Code Online (Sandbox Code Playgroud)

现在所有元数据都在硬盘上。我相信,通过这种方式,您可以用内存换取磁盘空间和 CPU 调用。

  1. 如果您希望获取文件的属性,只需读取JSON.parse其相应的元数据文件即可。