是否有更快的替代Perl的统计数据?

Wal*_*lly 4 perl performance stat

我正在遍历整个分区,stat()每个文件然后检查mtime,size和uid的返回值以反对散列值.stat()但是Perl的速度太慢了,我想知道是否有更快的替代品我可能会忽略.

Mic*_*man 18

当你打电话给stat你查询文件系统时,它会受到性能的限制.对于大量文件,这将是缓慢的; 它不是真正的Perl问题.

  • 这是最好的答案."stat()"是一个unix系统调用,同名的perl函数只是一个(非常薄的!)包装器.如果它很慢,那么由于所需的磁盘I/O而变慢,而且这不是你可以解决的问题. (7认同)

bri*_*foy 8

在您关闭优化统计数据之前,请使用Devel :: NYTProf查看真正的减速情况.

另外,请研究如何挂载文件系统的详细信息.是一切本地的,还是你在NFS或类似的东西上安装了什么?正如其他答案所指出的那样,有许多问题可能成为问题.在知道问题之前,不要花太多时间专注于任何潜在的问题.

祝好运,


mop*_*oke 6

stat正在对每个文件执行IO,如果您想要读取这些数据,这是无法避免的.所以这将是速度的限制,不能以我能想到的任何其他方式解决.

如果您反复stat使用相同的文件,请考虑使用Memoize.

use Memoize();

sub fileStat {
  my ($filename) = @_;
  return stat($filename);
}

Memoize::memoize('fileStat');
Run Code Online (Sandbox Code Playgroud)

  • 由于Memoize将为您构建一个巨大的缓存(如果您有RAM,则为千兆字节),它实际上将帮助超出文件系统缓存.但是,如果您要查找最近的更改,缓存有什么用处.使用Memoize可能不是一个好主意,因为它会在海报的用例上使用. (3认同)
  • 每次调用fileStat时,Memoize都会存储所有返回值,而不是只调用一次stat.是的,您可以为所有stat返回调用构建自己的缓存,但为什么Memoize会为您执行此操作? (2认同)

Gre*_*con 6

你已经看到它stat足够慢,所以不要在同一个文件上多次调用它.

-X(shell-ish文件测试运算符)perlfunc文档描述了一个很好的缓存stat:

如果任何文件测试(或其中之一的statlstat运营商)给出由孤下划线的特殊文件句柄,然后将前一个文件测试(或统计运算符)的统计结构中,节省了系统调用.(这不工作-t,你需要记住,lstat-l会留下值stat结构的符号链接,而不是真实的文件.)(另外,如果统计缓冲是由一个充满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 _;
Run Code Online (Sandbox Code Playgroud)