以下程序可以正常运行,但是大量数据需要无限的时间。
INPUT.txt . 实际上,我有多达1000行,每行有1到100个元素。
10
6
9
7
9 11
3 4
1 9
5 12
1 11
5 11
9 12
10 5 8
7 4 1
and so on...
last: 1 2 3 4 5 6 7 . . .any number of elements (100 in my case).
matrix.txt (TAB分隔)
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0
1 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
1 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0
and so on....upto 25000 lines
输出.txt
这些是在每个输入行中从matrix.txt取出的索引位置处元素的总和。
实际总和可能与此假设的示例输出不同。
1 1 1 1 1 0 1 1 1 2 2 2 2 2 . . .columns upto number of lines in input.txt
1 1 1 1 1 1 1 1 1 2 2 2 2 2
1 0 0 1 1 1 1 1 1 2 2 2 2 2
1 1 1 0 1 0 0 1 1 2 2 2 2 2
1 1 1 1 1 1 1 1 0 2 2 2 2 2
1 1 1 0 1 0 1 1 1 1 2 2 2 2
1 1 1 1 1 0 1 1 1 2 2 2 2 2
1 1 1 1 1 0 0 1 1 1 2 2 2 2
0 1 1 1 1 1 1 1 0 2 2 2 2 2
代码: 看看代码,它会帮助你理解正在发生的事情。
use List::Util 'sum';
my @indexes = do {
open my $fh, '<', "INPUT.txt";
map { [map {$_ - 1} split ' '] } <$fh>
};
open my $infh, '<', "matrix.txt";
open OUT, '>', "output.txt";
while (<$infh>) {
my @vals = split ' ';
print OUT join(' ', map {sum(@vals[@$_])} @indexes), "\n";
}
close OUT;
有没有其他方法可以在更短的时间内完成这项任务。
文件可用性:
输入文件:https://www.dropbox.com/s/48ikhnfs7gzk8vm/input.txt?dl=0
矩阵文件:https://www.dropbox.com/s/ebxi608eday9z1e/matrix.txt?dl=0
Module::Compile
,而该模块的最新版本在许多系统上测试失败。尝试像这样安装:cpanm Module::Compile@0.30
以获取在大多数系统上都可用的版本。 - Patrick J. S.matrix.txt
中的行是否是固定大小的? - Patrick J. S.