2013年5月7日星期二

[整理] linux 大文件排序


sort大文件时,内存不足的解决方法

sort一个大文件时,容易造成内存不够的情况,解决方案:
1:split bigFileName -l 按行分割
                                 -b 按大小分割 M K

2:再所有的子文件sort: sort -u subFileName > subFileName.tmp
3:合并所有的子文件: sort -m allSubFileName.tmp -u > resultFileName

注意:
1: “split:Output file suffixes exhausted”的解决方案:
分割文件时,默认的子文件是以两个字母组合的,当你要分割的大文件过大,即切割的子文件过多时,
已经超过26*26个,就会提示以上错误。split在提示我们输出的文件名后缀被用光了。这时加上-a参数即可,
表示用几个后缀,默认是2个。
split fileName -l $lines -a 3 "tempfile"
"tempfile"是切割后的子文件名的前缀。

2:split 的用法:
split 参数:
-a, --suffix-length=N   指定输出文件名的后缀,默认为2个
-b, --bytes=SIZE        指定输出文件的字节数,可跟K M;eg split file -b 10k
-C, --line-bytes=SIZE  每一输出档中,单行的最大 byte 数
-d, --numeric-suffixes 使用数字代替字母做后缀
-l, --lines=NUMBER    指定输出文件的行数

PS: sort 加上 -u 参数可以在排序的同时去重,或者通过管道交给 uniq 去重,以及做更多的动作.

-----另一个方案-----

大文件sort


先对文件按行split
1split -l 100000000 file #以一亿行分割,每行10个字符的文件,大约800M
然后sort
1#!/bin/sh
2for file in `ls x*`
3do
4        sort $file -T /home/xxx > $file.sort
5##重点在这的-T设置tmp参数,sort是会写缓存文件的工具,不会
6##一次性读取文件到内存,所以内存大小无所谓,但是默认会写系统区,可能造成系统区空间不够
7##所以找个比较大的地方放
8done
9sort -m `ls *.sort` > result
其实直接sort也是可以的,有-T就行了对付上G的文件没问题,会跑满cpu但是内存占用只有0.几
sort之后的文件可以直接uniq,uniq的速度是极其快的,一亿行的文件sort需时40分钟,uniq只需不到2分钟

没有评论: