如何加速Perl的readdir以获得250,000个文件的目录?

Wal*_*chi 4 perl performance readdir

我使用Perl readdir来获取文件列表,但是,该目录包含超过250,000个文件,这导致执行readdir并使用超过80MB的RAM的时间长(超过4分钟).由于这是每5分钟一次的重复工作,因此这个滞后时间是不可接受的.

更多信息:另一项工作将填写扫描目录(每天一次).此Perl脚本负责处理文件.为每个脚本迭代指定文件计数,目前每次运行1000次.Perl脚本每5分钟运行一次并处理(如果适用)最多1000个文件.文件计数限制旨在允许下游流处理随着Perl将数据推入数据库而触发复杂的工作流程.

是否有另一种从目录获取文件名的方法,理想情况下限制为1000(由变量设置),这将大大提高此脚本的速度?

dao*_*oad 9

当你说readdir花费几分钟和80 MB 时,你究竟是什么意思?你能展示一下特定的代码吗?你readdir在标量或列表上下文中使用?

你在做这样的事情:

foreach my $file ( readdir($dir) ) { 
   #do stuff here
}
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,您将整个目录列表读入内存.难怪它需要很长时间和很多记忆.

本文的其余部分假定这是问题,如果您没有readdir在列表上下文中使用,请忽略帖子的其余部分.

对此的修复是使用while循环并readdir在标量上下文中使用.

while ( 
    defined( my $file = readdir $dir )
 ) {

    # do stuff.

}
Run Code Online (Sandbox Code Playgroud)

现在你一次只读一个项目.您可以添加计数器以跟踪您处理的文件数量.


siu*_*nin 7

解决方案可能在另一端:在填充目录的脚本中......

为什么不创建一个arborescence来存储所有这些文件,这样有很多目录,每个目录都有可管理的文件数量?

而不是创建"mynicefile.txt"为什么不"m/my/mynicefile",或类似的东西?

您的文件系统会感谢您(特别是如果您在完成它们后删除空目录).