免费注册 查看新帖 |

Chinaunix

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

6G文件的排序处理 [复制链接]

论坛徽章:
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 15:58 |只看该作者 |倒序浏览
论坛中toniz 大大的关于perl大文件排序处理测试(与oracle外部表比较)
http://bbs.chinaunix.net/forum.p ... mp;fromuid=29097174
这个帖子提到对大文件分块后排序合并,如果我想处理两个大文件,这两个文件每四行为一部分的,然后按照每部分的第二行进行排序,并且合并,什么样的程序才能避免大文件导致的时间占用和内存问题呢?(数据库就不考虑了,要存那么多东西需要太大空间了)
——————————————
排序文件:
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
。。。。。
----------------------------------
求个程序学习,谢谢!

论坛徽章:
0
2 [报告]
发表于 2013-10-13 16:37 |只看该作者
大大我想

1: 文件分块:
按照每部分的第二行, 第一个字符分块
BCDBCDBD -> B文件
CACACAD   -> C文件
AABCCCCD -> A文件
......

2: 排序
排序  A文件
排序  B文件
排序  C文件
......

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
3 [报告]
发表于 2013-10-14 08:52 |只看该作者
fq格式的  这样排序有什么意义嘛·····  这是想组装?

论坛徽章:
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:56 |只看该作者
回复 2# gr33n


    这真的是个好主意!!!厉害。。。

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
5 [报告]
发表于 2013-10-14 12:24 |只看该作者
2楼主意不错,要是a开头的也有几个G咋整。。。
建议把文件打散成小文件,到系统能一次读进去的大小,排序每一个文件。然后两两比较合并输出。
分享个合并的想法:{:3_193:}
  1. sub merge_sorted_file {
  2.     my ($file1, $file2, $output_file) = @_;
  3.     my $fh1;
  4.     my $fh2;
  5.     my $output_fh;
  6.     my $smallest_so_far = q{};
  7.     use autodie qw{open close};

  8.     open $fh1, '<', $file1;
  9.     open $fh2, '<', $file2;

  10.     open $output_fh, '>>', $output_file;

  11.     my $line_f1 = <$fh1>;
  12.     my $line_f2 = <$fh2>;

  13.     while (1) {
  14.         if ($line_f1 le $line_f2) {
  15.             $smallest_so_far = $line_f1;
  16.             $line_f1 = <$fh1> if not eof $fh1;
  17.         }
  18.         else {
  19.             $smallest_so_far = $line_f2;
  20.             $line_f2 = <$fh2> if not eof $fh2;
  21.         }

  22.         print {$output_fh} $smallest_so_far;
  23.         last if eof $fh1 and eof $fh2;
  24.     }

  25.     close $fh1;
  26.     close $fh2;
  27.     close $output_fh;
  28. }
复制代码

论坛徽章:
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
6 [报告]
发表于 2013-10-14 12:29 |只看该作者
回复 5# stanley_tam


    谢谢,谢谢。。。可是如果分割成很多个文件再两两比较是不是太耗时间了呀?有具体实现吗?

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
7 [报告]
发表于 2013-10-14 12:46 |只看该作者
不会吧,比较速度应该比较快吧(因为文件已经sort了),你看上面的函数都只读取了2行而已。

论坛徽章:
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
8 [报告]
发表于 2013-10-14 12:59 |只看该作者
回复 7# stanley_tam


    嗯,我是说那个分割成很多文件后排序那个过程。。。
   大大可以给我一个完整的程序么,谢谢谢谢~

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2013-10-14 13:43 |只看该作者
不能拆分后排序,排序在一起比较才有意义,拆分成多个文件,比较的结果合并起来后还是乱的。

要么用二楼的办法,将排序的内容单独分离出来。标记上文件中的位置范围。排序后,按照文件范围顺序读取。

或者用快速排序算法。

论坛徽章:
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
10 [报告]
发表于 2013-10-14 13:54 |只看该作者
回复 9# 104359176


    首先要解决的问题是,文件很大,不分割的话肯定会被卡死的,第二是如果分割的话就需要考虑到时效的问题。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP