使用Perl进行重复数据删除,通过Windows批处理文件调用。在Windows中调用DOS窗口的批处理文件。批处理文件调用Perl脚本执行操作。我有批处理文件。所提供的代码脚本可以删除重复数据,但只适用于数据文件不太大的情况。需要解决的问题是对于更大的数据文件(2 GB或更大),当尝试将整个文件加载到数组中以删除重复数据时,会发生内存错误。内存错误发生在子例程中:-
@contents_of_the_file = <INFILE>;
(只要解决此问题,完全不同的方法也是可接受的,请提出建议。) 子程序是:
sub remove_duplicate_data_and_file
{
open(INFILE,"<" . $output_working_directory . $output_working_filename) or dienice ("Can't open $output_working_filename : INFILE :$!");
if ($test ne "YES")
{
flock(INFILE,1);
}
@contents_of_the_file = <INFILE>;
if ($test ne "YES")
{
flock(INFILE,8);
}
close (INFILE);
### TEST print "$#contents_of_the_file\n\n";
@unique_contents_of_the_file= grep(!$unique_contents_of_the_file{$_}++, @contents_of_the_file);
open(OUTFILE,">" . $output_restore_split_filename) or dienice ("Can't open $output_restore_split_filename : OUTFILE :$!");
if ($test ne "YES")
{
flock(OUTFILE,1);
}
for($element_number=0;$element_number<=$#unique_contents_of_the_file;$element_number++)
{
print OUTFILE "$unique_contents_of_the_file[$element_number]\n";
}
if ($test ne "YES")
{
flock(OUTFILE,8);
}
}
%seen
键。my $hashed_line = length($line) > 15 ? md5($line) : $line;
就可以解决问题了。另外,可以考虑使用Bit::Vector
替换%keep_line_num
以减少内存占用。 - dland