• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

perl处理文本文件抛出outofmemory

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

造成问题的原因是处理的文本文档有2g大小。

#2016.10.21 by ouyanga
#合并所有的词频文件到$result目录下de最终词频

my $fileDir=shift @ARGV or die "$!";
my $result;

$result=$fileDir."\\最终词频";

mkdir $result;

my $filepath=$fileDir."\\文件名.log";
my @dir; 

opendir (DIR, $fileDir);
@dir = readdir DIR;

open(out1, ">$filepath"); #输入

foreach $file (@dir) 
{ 
       if( $file =~ /\.txt$/)
    {
        print out1 $fileDir."\\".$file."\n";
    } 

} 
close(out1);

open (in2,$filepath);

#遍历包含文件名的列表
while($filename=<in2>){
    chomp($filename);
    
    print "read file ".$filename."\n";
    
    open(inTmp2, $filename) or die "cannot open ".$filename."\n";

    while(defined($word=<inTmp2>)){
        chomp($word);
        
        split("\t",$word);
                
        $words{$_[0]}+=$_[1];
            
    }
    close(inTmp2);
}
close(in2);

$result=$result."\\最终词频.txt";

open(out2,">".$result) or die "can not open". $result."\n";

foreach $w (sort keys %words){
    print out2 $w."\t".$words{$w}."\n";
}
close(out2);

print "game over.\n";

 解决方法:

对文件的内容进行hash,分解成多个小文件。

然后合并小文件里面重复的词。

再把小文件写到一个文件里面。

#2016.10.21 by ouyanga
#1.顺序读取文件,对于每个词Hash(x)%31。然后按着值存放到31个文件中。
#2.针对每个文件,统计词以及频率
#3.合并31个文件为一个文件

use Encode; 
my $fileDir=shift @ARGV or die "$!";#包含待处理文件的目录
my $result;

$result=$fileDir."\\分而治之";

mkdir $result;

my $filepath=$fileDir."\\文件名.log";
my @dir; 

opendir (DIR, $fileDir);
@dir = readdir DIR;

open(out1, ">$filepath"); #输入

foreach $file (@dir) 
{ 
       if( $file =~ /\.txt$/)
    {
        # 统计目录下得所有文件
        print out1 $fileDir."\\".$file."\n";
    } 

} 

close(out1);

open (in2,$filepath);

my $hash_value=31;
my %result_dir;

my $hashValue=31;
while($hashValue!=-1)
{
    $result_dir{$hashValue}="hash".$hashValue.".txt";
    --$hashValue;
}

#遍历包含文件名的列表
while(defined($filename=<in2>)){

    chomp($filename);
    
    print "read file ".$filename."\n";
    
    open(inTmp2, $filename) or die "cannot read open ".$filename."\n";

    # 对文件里面的词进行hash映射
    while(defined($word=<inTmp2>)){
        chomp($word);
        
        split(/\t/,$word);
        
        my $str=decode("gb2312",$_[0]); 

        @chars=split (//,$str);
     
        my $c=0;    #=ord($chars[0]);#ord把gb2312编码转为十进制。
        
        foreach $tc(@chars){
                                
            $c=$c*31+ord($tc);
        }
        
        $hash_value= $c%31;
        
        my $resultTxt=$result."\\".$result_dir{$hash_value};
        
        open(out2,">>".$resultTxt) or die "can write not open ". $resultTxt.". calcultate hash value is : $hash_value.\n";#追加内容
        
        print out2 $word."\n";
        
        close(out2);
    }
    
    close(inTmp2);
}

close(in2);

print "game over.\n";

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Perl中的特殊内置变量详解发布时间:2022-07-22
下一篇:
LINUX下设置定时运行PERL脚本发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap