加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中获取file2中没有出现的所有行的最快方法是什么?

发布时间:2020-12-15 23:31:34 所属栏目:大数据 来源:网络整理
导读:我有两个(非常大的)文本文件.在运行时方面,最快的方法是创建第三个文件,其中包含未出现在file2中的所有file1行? 所以如果file1包含: Sally Joe Tom Suzie 而file2包含: Sally Suzie Harry Tom 然后输出文件应包含: Joe 解决方法 创建一个包含文件2中每一
我有两个(非常大的)文本文件.在运行时方面,最快的方法是创建第三个文件,其中包含未出现在file2中的所有file1行?

所以如果file1包含:

Sally  
Joe  
Tom  
Suzie

而file2包含:

Sally  
Suzie  
Harry  
Tom

然后输出文件应包含:

Joe

解决方法

创建一个包含文件2中每一行的hashmap.然后,对于文件1中的每一行,如果它不在hashmap中,则输出它.这将是O(N),这是您可以实现的最佳效率等级,因为您必须阅读输入.

Perl实现:

#!/usr/bin/env perl
use warnings;
use strict;
use Carp ();

my $file1 = 'file1.txt';
my $file2 = 'file2.txt';

my %map;
{
    open my $in,'<',$file2 or Carp::croak("Cant open $file2");
    while (<$in>) {
      $map{$_} = 1;
    }
    close($in) or Carp::carp("error closing $file2");
}
{
   open my $in,$file1 or Carp::croak("Cant open $file1");
   while (<$in>) {
    if (!$map{$_}) {
      print $_;
    }
   }
   close $in or Carp::carp("error closing $file1");
}

如果文件2太大以至于hashmap不适合内存,那么我们手头就有了不同的问题.然后可能的解决方案是在文件2的块上使用上述解决方案(小到足以装入内存),将结果输出到临时文件.如果文件1和文件2之间有足够的匹配,那么总输出应该是合理的大小.为了计算最终结果,我们在临时文件中执行行的交集,即,对于在最终结果中的行,它必须在每个临时文件中出现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读