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