Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Perl计算32mb文件的熵-最快的方法是什么?_Perl_Math_Entropy - Fatal编程技术网

用Perl计算32mb文件的熵-最快的方法是什么?

用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

我有一个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 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的文件,具体取决于计算机。有没有更快的方法?我希望能够快速连续地计算多个文件的熵!我将新代码发送给模块维护人员()