首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS:扫描目录树非常缓慢

NodeJS:扫描目录树非常缓慢
EN

Stack Overflow用户
提问于 2016-03-03 10:40:23
回答 1查看 1.7K关注 0票数 5

我有一个NW.js应用程序,它简单地(递归地)扫描目录树并获取每个文件/目录的统计数据。它还对文件执行MD5。

我有29k文件,850文件夹,所有120 all的数据。

大约7分钟后,我的代码只扫描了29k文件上的4080个文件。

怎么可能这么慢?我能做些什么来提高性能吗?否则Node对我就没用了..。

令人惊讶的是,扫描1k文件只花了7秒。为什么只扫描4倍多的文件要长60倍?

当我检查进程时,我可以看到Node在RAM使用中移动了很多:从20 in到400 in(两者都在波动)。但CPU的使用率仍停留在1%。

这很奇怪,因为我不认为我分配了那么多RAM。实际上,我没有分配任何东西!请看下面的代码。

代码语言:javascript
复制
if (process.argv.length < 3)
    process.exit();


var fs = require('fs');
var md5 = require('md5');
var md5File = require('md5-file');

var iTotal = 0;
var iNbFiles = 0;
var iNbFolders = 0;

var iBegin = Date.now();

var App =
{
    scan: function(path)
    {
        var items = fs.readdirSync(path);
        var i, item, stats, fullPath, isFolder, fileMD5;
        var len = items.length;
        var md5Hash = md5(path);

        for (i = 0; i < len; i++)
        {
            item = items[i];
            fullPath = path + '/' + item;
            stats = fs.statSync(fullPath);
            if (stats.isSymbolicLink())
                continue;

            isFolder = stats.isDirectory();
            if (!isFolder)
            {
                fileMD5 = md5File(fullPath);
                iNbFiles++;
            }
            else
            {
                fileMD5 = null;
                iNbFolders++;
            }

            iTotal++;
            process.send({_type: 'item', name: item, path: path, path_md5: md5Hash, full_path: fullPath, file_md5: fileMD5, stats: stats, is_folder: isFolder});
            if (isFolder)
                App.scan(path + '/' + item);
        }

        process.send({_type: 'temp', total: iTotal, files: iNbFiles, folders: iNbFolders, elapsed: (Date.now() - iBegin)});
    }
};

App.scan(process.argv[2]);

// Send the final and definitive value of "total"
process.send({_type: 'total', total: iTotal, files: iNbFiles, folders: iNbFolders});

process.exit();
EN

回答 1

Stack Overflow用户

发布于 2016-03-04 09:00:52

使用像https://github.com/jprichardson/node-fs-extra#walk这样的任何节点模块

实际上,我没有分配任何东西!

Nop,您正在分配:任何对象创建或变量创建都将为此分配内存。另外,MD5文件通过流读取每个文件并计算校验和。因此,您需要发送所有内容的所有文件抛出CPU和内存。您使用同步版本的MD5 -在一次它将只计算一个文件。另外,这里有递归,还有许多文件:这意味着堆栈何时结束--您将有错误。我认为你有这个错误--你只是看不到它,或者你在没有任何进度反馈的情况下悄悄地运行它。使用异步目录读取和异步MD5计算。最好的解决方案是使用一些工作人员进程的集合(例如,6个核心CPU -6个工作人员)并将数据拉到这个工作程序中,他们将计算MD5。

更新1

递归内存泄漏示例:

代码语言:javascript
复制
var i=0;
function inc() {
    i++;
    var s = ""
    for(var n=0;n<4000;n++){ s+="0123456789" }
    inc();    
}
inc();

打开任务管理器并在浏览器中运行此代码--您将看到内存消耗增长的速度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35769834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档