免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6343 | 回复: 10
打印 上一主题 下一主题

perl可以按列处理数据吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-22 15:06 |只看该作者 |倒序浏览
我有一个20000行×10000列的matrix,需要对每一列进行数据处理,请问有没有比较快速的处理方法?谢谢!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2016-07-22 15:11 |只看该作者
需要进行怎样的数据处理,举个例子先。

论坛徽章:
0
3 [报告]
发表于 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根本读不进内存,所以只能一行一行处理了

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2016-07-22 15:32 |只看该作者
那就一行一行来呗,这种类型的数据 perl 对内存的消耗可比 R 多多了,有个 PDL 理念和 R 差不多,但是太小众

论坛徽章:
0
5 [报告]
发表于 2016-07-22 15:54 |只看该作者
回复 4# zhlong8


    啥!?R的内存占用会比PERL小吗?我每次就是因为R处理大数据太慢了才不得不用PERL的

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
6 [报告]
发表于 2016-07-22 16:30 |只看该作者
处理列数据 AWK 最合适了. 不过这么大的数据量。(40000 x 10000). 还按照列处理,建议先费劲转置一次后,然后,就可以简单了。用 perl, Python, Ruby, Awk,都可以。

论坛徽章:
0
7 [报告]
发表于 2016-07-22 16:36 |只看该作者
回复 6# 104359176


    好主意谢谢~

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
8 [报告]
发表于 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. }
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2016-07-22 20:51 |只看该作者
我担心的是机器能不能跑起来,4W X 1W = 10 亿。如果按照 Perl 的存储效率,普通数组的话,我估计 2-3G, 才能装的下,如果用Hash, 呵呵。。我估计没有机会用样的机器。 不过实际跑一下就知道了。一个简单的操作,让你等待大半天的时间,最后告诉你,内存溢出,这种感觉实在是难忘。

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
10 [报告]
发表于 2016-07-22 23:23 |只看该作者
回复 3# wx2wx

没看出来哪里排序了?举个栗子好吗?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP