【发布时间】:2017-03-02 17:37:01
【问题描述】:
我需要将两个文件合并成一个新文件。
两者有超过 3 亿条管道分隔的记录,第一列作为主键。行未排序。第二个文件可能有第一个文件没有的记录。
示例文件 1:
1001234|X15X1211,J,S,12,15,100.05
示例文件 2:
1231112|AJ32,,,18,JP
1001234|AJ15,,,16,PP
输出:
1001234,X15X1211,J,S,12,15,100.05,AJ15,,,16,PP
我正在使用以下代码:
tie %hash_REP, 'Tie::File::AsHash', 'rep.in', split => '\|'
my $counter=0;
while (($key,$val) = each %hash_REP) {
if($counter==0) {
print strftime "%a %b %e %H:%M:%S %Y", localtime;
}
}
准备关联数组需要将近 1 个小时。 它真的很好还是真的很糟糕? 有没有更快的方法来处理关联数组中如此大小的记录? 任何脚本语言的任何建议都会有帮助。
谢谢, 尼丁T。
我也尝试了以下程序,也花了 1+ 小时如下:
#!/usr/bin/perl
use POSIX qw(strftime);
my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
print $now_string . "\n";
my %hash;
open FILE, "APP.in" or die $!;
while (my $line = <FILE>) {
chomp($line);
my($key, $val) = split /\|/, $line;
$hash{$key} = $val;
}
close FILE;
my $filename = 'report.txt';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
open FILE, "rep.in" or die $!;
while (my $line = <FILE>) {
chomp($line);
my @words = split /\|/, $line;
for (my $i=0; $i <= $#words; $i++) {
if($i == 0)
{
next;
}
print $fh $words[$i] . "|^"
}
print $fh $hash{$words[0]} . "\n";
}
close FILE;
close $fh;
print "done\n";
my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
print $now_string . "\n";
【问题讨论】:
-
这篇评论反映了你糟糕的表现结果:cpanratings.perl.org/dist/Tie-File-AsHash
-
你坚持绑吗?有什么特别的原因吗?
-
您使用
each迭代哈希的事实向我表明,您实际上并不需要首先使用磁盘数据结构。您实际上想在这里解决什么问题? -
@Nitin Tripathi,任何提供基于 tie 的界面的东西都会比不提供的要慢。
-
我会将这两个文件导入一个 sqlite 并让它处理它。让它在磁盘上,让它花一些时间,但不要试图将所有东西都加载到内存中。
标签: perl