您好我正在尝试导入大量数据。它大约8GB,有超过53k的文件。 我想要的是一次导入一个文件,完成它的使用,然后删除/删除或垃圾收集缓存。
我知道当我们使用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
?
或者可能是如何调整我的代码以实现它将对文件夹中的任意数量的文件起作用的功能。
任何帮助将不胜感激
答案 0 :(得分:1)
我发现您的代码存在两个大问题:
require
能够加载一个没问题的json文件,但主要问题是它是同步执行的,所以你不能正确使用node.js异步性质,这就是为什么不推荐使用要求动态文件,require
用于应用程序初始化,因为它会在您的情况下使用无效的缓存机制,这会降低您的应用程序速度。stream
api重构您的体系结构这是流可以发光的用例。解决问题的方法是深入了解资源:
JSONStream
npm模块fs.createReadStream
模块的fs
醇>
我们的想法是遍历你正在做的目录中的所有文件,然后为每个文件创建一个读取流,然后通过这种方式管道JSONStream.parse
,你将获得大量的内存。 / p>
答案 1 :(得分:0)
您无法明确告诉垃圾收集器释放对象。一旦垃圾收集器意识到没有对该对象的更多引用,就会销毁该对象。要实现这一点,您必须确保删除对该对象的所有引用。只要至少有一个引用,该对象就会留在内存中。
您解决承诺的那一刻,currentFile
不再被引用,最终将被垃圾收集。