gpt4 book ai didi

regex - Perl 程序可有效处理目录中的 500,000 个小文件

转载 作者:行者123 更新时间:2023-12-04 22:09:47 24 4
gpt4 key购买 nike

我每天晚上都在处理一个大目录。它每晚累积大约 100 万个文件,其中一半是 .txt 文件,我需要根据其内容移动到不同的目录。

每个 .txt 文件都以竖线分隔,仅包含 20 条记录。记录 6 是包含确定将文件移动到哪个目录所需的信息的记录。

示例记录:

A|CHNL_ID|4

在这种情况下,文件将被移动到 /out/4

此脚本以每小时 80,000 个文件的速度处理。

有没有关于如何加快速度的建议?
opendir(DIR, $dir) or die "$!\n";
while ( defined( my $txtFile = readdir DIR ) ) {
next if( $txtFile !~ /.txt$/ );
$cnt++;

local $/;
open my $fh, '<', $txtFile or die $!, $/;
my $data = <$fh>;
my ($channel) = $data =~ /A\|CHNL_ID\|(\d+)/i;
close($fh);

move ($txtFile, "$outDir/$channel") or die $!, $/;
}
closedir(DIR);

最佳答案

尝试类似:

print localtime()."\n";                          #to find where time is spent
opendir(DIR, $dir) or die "$!\n";
my @txtFiles = map "$dir/$_", grep /\.txt$/, readdir DIR;
closedir(DIR);

print localtime()."\n";
my %fileGroup;
for my $txtFile (@txtFiles){
# local $/ = "\n"; #\n or other record separator
open my $fh, '<', $txtFile or die $!;
local $_ = join("", map {<$fh>} 1..6); #read 6 records, not whole file
close($fh);
push @{ $fileGroup{$1} }, $txtFile
if /A\|CHNL_ID\|(\d+)/i or die "No channel found in $_";
}

for my $channel (sort keys %fileGroup){
moveGroup( @{ $fileGroup{$channel} }, "$outDir/$channel" );
}
print localtime()." finito\n";

sub moveGroup {
my $dir=pop@_;
print localtime()." <- start $dir\n";
move($_, $dir) for @_; #or something else if each move spawns sub process
#rename($_,$dir) for @_;
}

这将工作分为三个主要部分,您可以在其中为每个部分计时以找出花费最多时间的地方。

关于regex - Perl 程序可有效处理目录中的 500,000 个小文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49332466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com