我遍历整个分区,stat()
'查找每个文件,然后根据哈希值检查mtime,size和uid的返回值。 stat()
然而在Perl中速度太慢了,我想知道是否有更快的替代方案我可能会忽略。
答案 0 :(得分:18)
当您致电stat
时,您正在查询文件系统,并且会受到其性能的限制。对于大量文件,这将是缓慢的;它不是真正的Perl问题。
答案 1 :(得分:8)
在您开始优化stat之前,请使用Devel::NYTProf查看真正减速的位置。
另外,请研究如何安装文件系统的详细信息。是一切本地的,还是你在NFS或类似的东西上安装了什么?正如其他答案所指出的那样,有许多问题可能成为问题。在你知道问题之前,不要花太多时间专注于任何潜在的问题。
祝你好运,答案 2 :(得分:6)
stat
正在对每个文件执行IO,如果您想要读取这些数据,这是无法避免的。所以这将是速度的限制,不能以我能想到的任何其他方式解决。
如果您反复stat
使用相同的文件,请考虑使用Memoize
。
use Memoize();
sub fileStat {
my ($filename) = @_;
return stat($filename);
}
Memoize::memoize('fileStat');
答案 3 :(得分:6)
您已经看到stat
已经足够慢了,所以不要在同一个文件上多次调用它。
perlfunc documentation on -X(shell-ish文件测试运算符)描述了stat
的一个很好的缓存:
如果任何文件测试(或
stat
或lstat
运算符)被赋予由单独下划线组成的特殊文件句柄,那么前一个文件测试(或stat运算符)的stat结构)使用,保存系统调用。 (这不适用于-t
,您需要记住lstat
和-l
会在符号链接的统计结构中保留值,而不是真实文件。)(另外,如果统计缓冲区被lstat
调用填充,-T
和-B
将使用stat _
的结果重置它。例如:print "Can do.\n" if -r $a || -w _ || -x _; stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; print "Executable\n" if -x _; print "Setuid\n" if -u _; print "Setgid\n" if -g _; print "Sticky\n" if -k _; print "Text\n" if -T _; print "Binary\n" if -B _;
答案 4 :(得分:-3)
ls
并解析输出,我应该想一想。 find
可能是一个很好的选择,如果你只是想对你的统计数据作出决定。ls
输出中获得。 dir
命令可以使用日期和大小。 答案 5 :(得分:-3)
考虑File::Find模块。