【发布时间】:2016-03-01 21:40:20
【问题描述】:
我有一个基因和分数列表,我想根据分数对基因进行排序。列表很大(约 4200 万行),Perl sort 函数太慢了。
使用 Sort::External 模块我可以加快这个过程,但它只正确排序正整数。这是我尝试过的(我只展示了 10 个案例):
use warnings;
use strict;
use Sort::External;
my %hash = (
'gene1' => -19.86,
'gene2' => -12.90,
'gene3' => 4.07,
'gene4' => 22.59,
'gene5' => 55.43,
'gene6' => 55.42,
'gene7' => 9.89,
'gene8' => 27.51,
'gene9' => 6.43,
'gene10' => 59.65
);
my @sortkeys;
while ( my ( $gene, $score ) = each %hash ) {
push @sortkeys, ( pack( 'n', $score ) . $gene );
}
my $sortex = Sort::External->new( mem_threshold => 1024**2 * 8 );
$sortex->feed(@sortkeys);
$sortex->finish;
my @sorted;
while ( defined( $_ = $sortex->fetch ) ) {
push @sorted, substr( $_, 2 );
}
foreach (@sorted){
print join("\t",$_,$hash{$_}),"\n";
}
这是输出:
gene3 4.07
gene9 6.43
gene7 9.89
gene4 22.59
gene8 27.51
gene5 55.43
gene6 55.42
gene10 59.65
gene1 -19.86
gene2 -12.9
对具有正负非整数值的哈希键进行快速排序的最佳解决方案是什么?
【问题讨论】:
-
你为什么要打包未签名的?
-
数据库和表索引相当擅长。
-
你能给出一个“巨大”有多大的大致概念吗?我们说的是一百万行还是十亿行?
-
@stark,没关系。
pack('n', -100)、pack('S>', -100)和pack('s>', -100)都产生相同的结果。n是这些选项中最熟悉的。 -
@Sobrique ~4200 万行。
标签: perl sorting hash negative-number