我正在分析在句子中连续出现的一组单词的出现频率。
每个组包括三个单词,我们需要计算它们的频率。
例如:This is a good time to party because this is a vacation time.
期望输出结果:
这段代码效果很好,将按词组出现频率降序打印。只会打印那些出现超过20次的词组。
那么如何处理超过100万或1000万行的文件?
我还使用Linux的top命令来检查perl运行此脚本时的内存和CPU使用情况,并观察到在处理包含40万行的文件时,CPU使用率达到了100%,而内存使用率接近90%。
因此,对于包含一百万行的文件,无法使其正常工作,因为perl进程将会挂起。
如何使这段代码更节省内存?
每个组包括三个单词,我们需要计算它们的频率。
例如:This is a good time to party because this is a vacation time.
期望输出结果:
this is a - 2
is a good - 1
a good time - 1
等等其他内容。
我编写了一个脚本,它工作得很好,并打印出按降序排列的频率。
它通过逐行读取文件来工作。对于每一行,它将其转换为小写,将其分割成单个单词,然后形成一个数组。
然后,我们从左侧开始每次选择3个单词,并继续形成存储出现次数计数的哈希表。完成后,我们移动数组中最左边的元素并重复此过程,直到我们的数组包含超过3个单词为止。
问题更新:
问题是,我想在包含超过1000万行的文件上使用此脚本。
经过一些测试,我发现如果输入文件中的行数超过400K,则它将无法工作。
如何使此脚本更加内存高效?
感谢fxzuz提供的建议,但现在我想使此脚本适用于更大的文件:)
#!/usr/bin/perl
use strict;
use warnings;
print "Enter the File name: ";
my $input = <STDIN>;
chomp $input;
open INPUT, '<', $input
or die("Couldn't open the file, $input with error: $!\n");
my %c;
while (my $line = <INPUT>) {
chomp $line;
my @x = map lc, split /\W+/, join "", $line;
while (@x>3) {
$c{"@x[0..2]"}++;
shift @x;
}
}
foreach $key (sort {$c{$b} <=> $c{$a}} keys %c) {
if($c{$key} > 20) {
print $key." - ".$c{$key}."\n";
}
}
close INPUT;
这段代码效果很好,将按词组出现频率降序打印。只会打印那些出现超过20次的词组。
那么如何处理超过100万或1000万行的文件?
我还使用Linux的top命令来检查perl运行此脚本时的内存和CPU使用情况,并观察到在处理包含40万行的文件时,CPU使用率达到了100%,而内存使用率接近90%。
因此,对于包含一百万行的文件,无法使其正常工作,因为perl进程将会挂起。
如何使这段代码更节省内存?