免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell怎么优化对大文件的排序 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-13 16:10 |只看该作者 |倒序浏览
前几天看了论坛中toniz 大大的关于perl大文件排序处理测试(与oracle外部表比较)
http://bbs.chinaunix.net/forum.p ... mp;fromuid=29097174
这个帖子提到对大文件分块后排序合并,如果我想用shell去合并排序处理两个超大文件,如果用sort的话肯定特费时间和内存,shell会不会有相关的方法可以优化排序呢。
比如我现在的两个大文件,每四行作为一部分,按照第二行的字母顺序排序(ABCDEFG....),如下:
——————————————
排序文件:
1.txt:
@12@vip.com#20120307/1
BCDBCDBD
+
AAAAAAAA
@18@vip.com#20120307/1
BBDACCDA
+
AAAAAAAA
...
2.txt
@14@vip.com#20120307/1
AABCCCCD
+
AAAAAAAA
@12@vip.com#20120307/1
BCACACAD
+
AAAAAAAA
...
————————————————
结果:
@14@vip.com#20120307/1
AABCCCCD
+
AAAAAAAA
@18@vip.com#20120307/1
BBDACCDA
+
AAAAAAAA
@12@vip.com#20120307/1
BCACACAD
+
AAAAAAAA
@18@vip.com#20120307/1
BBDACCDA
+
AAAAAAAA
。。。。。
----------------------------------
我尝试首先把四行处理成一行,然后用split分割成N个文件,几个几个的比较。。。结果当然不理想,因为实在太慢太慢了。。。
只好来求各位高手帮忙了~谢谢大大~

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2013-10-13 17:30 |只看该作者
你要不看看awk 的冒泡排序?

其实shell里sort命令算是快的了。
  1. xargs -n4 < infile |sort -k2 |xargs -n1
  2. @14@vip.com#20120307/1
  3. AABCCCCD
  4. +
  5. AAAAAAAA
  6. @18@vip.com#20120307/1
  7. BBDACCDA
  8. +
  9. AAAAAAAA
  10. @12@vip.com#20120307/1
  11. BCACACAD
  12. +
  13. AAAAAAAA
  14. @12@vip.com#20120307/1
  15. BCDBCDBD
  16. +
  17. AAAAAAAA
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
3 [报告]
发表于 2013-10-14 08:03 |只看该作者
好像叫新版本的sort有对大文件排序优化参数。man一下就可以知道。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
4 [报告]
发表于 2013-10-14 08:58 |只看该作者
回复 3# rdcwayx


    文件实在太大了,我想试试多路归并的方法,可是一直找不到窍门。。。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5 [报告]
发表于 2013-10-14 13:01 |只看该作者
回复 4# damcool


    有具体的实现方法吗?

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
6 [报告]
发表于 2013-10-14 16:14 |只看该作者
huang6894 发表于 2013-10-14 13:01
回复 4# damcool

先说一下文件格式。是否第三四行总是一样?再说一下文件大小或者数据规模。这样可能比较好考虑你的问题。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
7 [报告]
发表于 2013-10-14 16:51 |只看该作者
回复 7# damcool


    第三第四行不影响全局的吧~文件大概是6个G的样子。
   我用了一个很笨的方法去处理,总觉得乖乖的。。。
  1. #!/bin/sh
  2. #$ -S /bin/sh

  3. fq="$1"

  4. split -l 2000000 -d $fq use
  5. for i in `ls ./use*`
  6. do
  7. paste -sd '\t\t\t\n' $i>$i".fq"
  8. sort -k2 $i".fq" >$i".fq.sort"
  9. rm $i $i".fq"
  10. done

  11. sort -m *fq.sort >result.fq
  12. rm *fq.sort
复制代码
而且如果我要还原回去原来的格式 sed 's/\t/\n/g' result.fq太费CPU了。。。那么整个脚本就没意义了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP