Chinaunix
标题:
perl可以按列处理数据吗?
[打印本页]
作者:
wx2wx
时间:
2016-07-22 15:06
标题:
perl可以按列处理数据吗?
我有一个20000行×10000列的matrix,需要对每一列进行数据处理,请问有没有比较快速的处理方法?谢谢!
作者:
sunzhiguolu
时间:
2016-07-22 15:11
需要进行怎样的数据处理,举个例子先。
作者:
wx2wx
时间:
2016-07-22 15:22
回复
2#
sunzhiguolu
> m<-matrix(sample(1:10,100,replace=T),nrow=20)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 5 3 5 6 7
[2,] 10 6 9 9 1
[3,] 7 4 1 6 8
[4,] 9 2 8 3 9
[5,] 10 2 8 1 9
[6,] 4 5 8 9 6
[7,] 4 8 1 3 3
[8,] 1 2 8 1 6
[9,] 10 9 7 5 7
[10,] 5 7 9 10 9
[11,] 8 2 9 8 3
[12,] 1 10 1 4 2
[13,] 3 7 3 2 6
[14,] 6 1 5 6 5
[15,] 8 3 10 7 1
[16,] 6 3 5 5 4
[17,] 2 2 2 2 10
[18,] 8 6 6 3 10
[19,] 3 4 3 8 7
[20,] 8 7 6 10 6
> n<-apply(m,2,rank,ties.method="min")
> n
[,1] [,2] [,3] [,4] [,5]
[1,] 8 7 7 11 12
[2,] 18 13 17 17 1
[3,] 12 10 1 11 15
[4,] 17 2 13 5 16
[5,] 18 2 13 1 16
[6,] 6 12 13 17 8
[7,] 6 18 1 5 4
[8,] 1 2 13 1 8
[9,] 18 19 12 9 12
[10,] 8 15 17 19 16
[11,] 13 2 17 15 4
[12,] 1 20 1 8 3
[13,] 4 15 5 3 8
[14,] 10 1 7 11 7
[15,] 13 7 20 14 1
[16,] 10 7 7 9 6
[17,] 3 2 4 3 19
[18,] 13 13 10 5 19
[19,] 4 10 5 15 12
[20,] 13 15 10 19 8
复制代码
其实就是对每一列进行排序,这是用R写的,但是由于数据太大R根本读不进内存,所以只能一行一行处理了
作者:
zhlong8
时间:
2016-07-22 15:32
那就一行一行来呗,这种类型的数据 perl 对内存的消耗可比 R 多多了,有个 PDL 理念和 R 差不多,但是太小众
作者:
wx2wx
时间:
2016-07-22 15:54
回复
4#
zhlong8
啥!?R的内存占用会比PERL小吗?我每次就是因为R处理大数据太慢了才不得不用PERL的
作者:
104359176
时间:
2016-07-22 16:30
处理列数据 AWK 最合适了. 不过这么大的数据量。(40000 x 10000). 还按照列处理,建议先费劲转置一次后,然后,就可以简单了。用 perl, Python, Ruby, Awk,都可以。
作者:
wx2wx
时间:
2016-07-22 16:36
回复
6#
104359176
好主意谢谢~
作者:
sunzhiguolu
时间:
2016-07-22 17:36
本帖最后由 sunzhiguolu 于 2016-07-22 18:28 编辑
回复
3#
wx2wx
大师, 有个地方没弄明白 按列排序 指的是纵向的, 还是横向的?
如果是纵向的, 那就每次只加载一列数据 处理完所有行之后 再进行排序; 接着从下一列开始继续处理 直到处理完最后一列为止.
不知道是否可行, 示例代码如下:
#!/usr/bin/perl
use strict;
use warnings;
my ($flag, $offset, @aData) = (1, 0);
while ($flag){
open (my $fh, '<', 'path/urfile');
while (defined (local $_ = <$fh>)){
my @aLine = split;
push (@aData, $aLine[$offset]);
}
close ($fh);
$flag = 0 if (++$offset == 9999);
{
# business code is here ...
# @aData = ();
}
}
复制代码
作者:
104359176
时间:
2016-07-22 20:51
我担心的是机器能不能跑起来,4W X 1W = 10 亿。如果按照 Perl 的存储效率,普通数组的话,我估计 2-3G, 才能装的下,如果用Hash, 呵呵。。我估计没有机会用样的机器。 不过实际跑一下就知道了。一个简单的操作,让你等待大半天的时间,最后告诉你,内存溢出,这种感觉实在是难忘。
作者:
RE_HASH
时间:
2016-07-22 23:23
回复
3#
wx2wx
没看出来哪里排序了?举个栗子好吗?
作者:
RE_HASH
时间:
2016-07-22 23:42
104359176 发表于 2016-07-22 20:51
4W X 1W = 10 亿
你是学经济的吧?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2