用Perl计算32mb文件的熵-最快的方法是什么?
我有一个32678KB的加密bin文件,我需要它的熵。我正在使用Perl作为一个更大项目的一部分 到目前为止,我使用了以下“技巧”:用Perl计算32mb文件的熵-最快的方法是什么?,perl,math,entropy,Perl,Math,Entropy,我有一个32678KB的加密bin文件,我需要它的熵。我正在使用Perl作为一个更大项目的一部分 到目前为止,我使用了以下“技巧”: use Shannon::Entropy qw/entropy/; my $file = "test.bin"; open(my $bin, "<", $file) or die $!; binmode $bin; seek($bin, 0x000000, 0); read($bin, my $entropy, 0x01FFFFF0); print ent
use Shannon::Entropy qw/entropy/;
my $file = "test.bin";
open(my $bin, "<", $file) or die $!; binmode $bin;
seek($bin, 0x000000, 0);
read($bin, my $entropy, 0x01FFFFF0);
print entropy($entropy);
使用香农::熵qw/熵/;
my$file=“test.bin”;
open(my$bin,“这里是重新编写的熵函数,以避免所有map调用
sub entropy {
my ($entropy, $len, $p, %t) = (0, length($_[0]));
my @chars = split '', $_[0];
$t{$_}++ foreach @chars;
foreach (values %t) {
$p = $_/$len;
$entropy -= $p * log $p ;
}
return $entropy / log 2;
}
这对你来说可能会更快
我对此有了第二个想法。你实际上不需要将文件读入内存。$len
是可以从-s$file\u name
中获取的文件长度,%t
是可以通过一次读取一个块来计算的频率表。因此,一个用于计算fi熵的函数版本我会的
sub file_entropy {
my ($file_name) = @_;
# Get number of bytes in file
my $len = -s $file_name;
my ($entropy, %t) = 0;
open (my $file, '<', $file_name) || die "Cant open $file_name\n";
binmode $file;
# Read in file 1024 bytes at a time to create frequancy table
while( read( $file, my $buffer, 1024) ) {
$t{$_}++
foreach split '', $buffer;
$buffer = '';
}
foreach (values %t) {
my $p = $_/$len;
$entropy -= $p * log $p ;
}
return $entropy / log 2;
}
子文件{
我的($file\u name)=@;
#获取文件中的字节数
my$len=-s$file\u name;
my($熵,%t)=0;
打开(我的$file,这里是重新编写的熵函数,以避免所有map调用
sub entropy {
my ($entropy, $len, $p, %t) = (0, length($_[0]));
my @chars = split '', $_[0];
$t{$_}++ foreach @chars;
foreach (values %t) {
$p = $_/$len;
$entropy -= $p * log $p ;
}
return $entropy / log 2;
}
这对你来说可能会更快
我对此有了第二个想法。你实际上不需要将文件读入内存。$len
是可以从-s$file\u name
中获取的文件长度,%t
是可以通过一次读取一个块来计算的频率表。因此,一个用于计算fi熵的函数版本我会的
sub file_entropy {
my ($file_name) = @_;
# Get number of bytes in file
my $len = -s $file_name;
my ($entropy, %t) = 0;
open (my $file, '<', $file_name) || die "Cant open $file_name\n";
binmode $file;
# Read in file 1024 bytes at a time to create frequancy table
while( read( $file, my $buffer, 1024) ) {
$t{$_}++
foreach split '', $buffer;
$buffer = '';
}
foreach (values %t) {
my $p = $_/$len;
$entropy -= $p * log $p ;
}
return $entropy / log 2;
}
子文件{
我的($file\u name)=@;
#获取文件中的字节数
my$len=-s$file\u name;
my($熵,%t)=0;
打开(我的$file,'尝试使用read_binary()
from读取文件。如果失败,这个熵函数可能会非常慢。看看,是的,它会非常慢,因为它将参数拆分为一个字符列表-32678个元素,然后它将这些元素映射到创建一个新的32678个元素列表,该列表被映射到…你可能会得到spee的数量级d通过重写它来避免所有这些列表来改进。我想我可以试一试,很遗憾我不得不使用Shanon熵。上面是CPAN上唯一的一个。谢谢:)(呃,32678*1024个元素)尝试使用read\u binary()
from读取文件。如果失败,这个熵函数可能会非常慢。看看,是的,它会非常慢,因为它将参数拆分为一个字符列表-32678个元素,然后它将这些元素映射到创建一个新的32678个元素列表,该列表被映射到…你可能会得到spee的数量级通过重写它来避免所有这些列表。我想我可以试一试,很遗憾我不得不使用Shanon熵。上面是CPAN上唯一的一个。谢谢:)(呃,32678*1024个元素)打开我的$fh,'你第一次写的很棒,我可以在10-15秒内计算出一个32mb的文件,具体取决于计算机。有没有更快的方法?我希望能够快速连续地计算多个文件的熵!我将新代码发送给模块维护人员()打开我的$fh,'你第一次写的很棒,我可以在10-15秒内计算出一个32mb的文件,具体取决于计算机。有没有更快的方法?我希望能够快速连续地计算多个文件的熵!我将新代码发送给模块维护人员()