Wal*_*chi 4 perl performance readdir
我使用Perl readdir来获取文件列表,但是,该目录包含超过250,000个文件,这导致执行readdir并使用超过80MB的RAM的时间长(超过4分钟).由于这是每5分钟一次的重复工作,因此这个滞后时间是不可接受的.
更多信息:另一项工作将填写扫描目录(每天一次).此Perl脚本负责处理文件.为每个脚本迭代指定文件计数,目前每次运行1000次.Perl脚本每5分钟运行一次并处理(如果适用)最多1000个文件.文件计数限制旨在允许下游流处理随着Perl将数据推入数据库而触发复杂的工作流程.
是否有另一种从目录获取文件名的方法,理想情况下限制为1000(由变量设置),这将大大提高此脚本的速度?
当你说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)
现在你一次只读一个项目.您可以添加计数器以跟踪您处理的文件数量.
解决方案可能在另一端:在填充目录的脚本中......
为什么不创建一个arborescence来存储所有这些文件,这样有很多目录,每个目录都有可管理的文件数量?
而不是创建"mynicefile.txt"为什么不"m/my/mynicefile",或类似的东西?
您的文件系统会感谢您(特别是如果您在完成它们后删除空目录).
归档时间: |
|
查看次数: |
4954 次 |
最近记录: |