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
  1. > m<-matrix(sample(1:10,100,replace=T),nrow=20)
  2. > m
  3.       [,1] [,2] [,3] [,4] [,5]
  4. [1,]    5    3    5    6    7
  5. [2,]   10    6    9    9    1
  6. [3,]    7    4    1    6    8
  7. [4,]    9    2    8    3    9
  8. [5,]   10    2    8    1    9
  9. [6,]    4    5    8    9    6
  10. [7,]    4    8    1    3    3
  11. [8,]    1    2    8    1    6
  12. [9,]   10    9    7    5    7
  13. [10,]    5    7    9   10    9
  14. [11,]    8    2    9    8    3
  15. [12,]    1   10    1    4    2
  16. [13,]    3    7    3    2    6
  17. [14,]    6    1    5    6    5
  18. [15,]    8    3   10    7    1
  19. [16,]    6    3    5    5    4
  20. [17,]    2    2    2    2   10
  21. [18,]    8    6    6    3   10
  22. [19,]    3    4    3    8    7
  23. [20,]    8    7    6   10    6
  24. > n<-apply(m,2,rank,ties.method="min")
  25. > n
  26.       [,1] [,2] [,3] [,4] [,5]
  27. [1,]    8    7    7   11   12
  28. [2,]   18   13   17   17    1
  29. [3,]   12   10    1   11   15
  30. [4,]   17    2   13    5   16
  31. [5,]   18    2   13    1   16
  32. [6,]    6   12   13   17    8
  33. [7,]    6   18    1    5    4
  34. [8,]    1    2   13    1    8
  35. [9,]   18   19   12    9   12
  36. [10,]    8   15   17   19   16
  37. [11,]   13    2   17   15    4
  38. [12,]    1   20    1    8    3
  39. [13,]    4   15    5    3    8
  40. [14,]   10    1    7   11    7
  41. [15,]   13    7   20   14    1
  42. [16,]   10    7    7    9    6
  43. [17,]    3    2    4    3   19
  44. [18,]   13   13   10    5   19
  45. [19,]    4   10    5   15   12
  46. [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
大师, 有个地方没弄明白 按列排序 指的是纵向的, 还是横向的?

如果是纵向的, 那就每次只加载一列数据 处理完所有行之后 再进行排序; 接着从下一列开始继续处理 直到处理完最后一列为止.
不知道是否可行, 示例代码如下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($flag, $offset, @aData) = (1, 0);
  5. while ($flag){
  6.     open (my $fh, '<', 'path/urfile');
  7.     while (defined (local $_ = <$fh>)){
  8.         my @aLine = split;
  9.         push (@aData, $aLine[$offset]);
  10.     }
  11.     close ($fh);
  12.     $flag = 0 if (++$offset == 9999);
  13.     {
  14.         # business code is here ...
  15.         # @aData = ();
  16.     }
  17. }
复制代码

作者: 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