对大文本文件进行去重

在很数据日志等的处理中,我们会需要对大文本内容进行去重,这时候如果全部读入内存,肯定是会爆的了,因此,我们需要进行分治,而分治的前提是,文件是有序的,重复的内容在分割后,在同一个文件里面。磨刀不误砍柴工,看起来去重前先排序好像很蠢,但是实际上效率是有保障的,在排序的时候可以使用并行的方法,提高排序效率。下面脚本来自stackoverflow

#! /bin/ksh

MAX_LINES_PER_CHUNK=5000000
ORIGINAL_FILE=$1
SORTED_FILE=$2
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted

usage ()
{
     echo Parallel sort
     echo usage: psort file1 file2
     echo Sorts text file file1 and stores the output in file2
     echo Note: file1 will be split in chunks up to $MAX_LINES_PER_CHUNK lines
     echo  and each chunk will be sorted in parallel
}

# test if we have two arguments on the command line
if [ $# != 2 ]
then
    usage
    exit
fi

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
rm -f $SORTED_FILE

#Splitting $ORIGINAL_FILE into chunks ...
split  -l $MAX_LINES_PER_CHUNK -a 4  $ORIGINAL_FILE $CHUNK_FILE_PREFIX

for file in $CHUNK_FILE_PREFIX*
do
    sort $file > $file.sorted &
done
wait

#Merging chunks to $SORTED_FILE ...
sort -m $SORTED_CHUNK_FILES > $SORTED_FILE

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null

其中MAX_LINES_PER_CHUN是你排序的分块大小,看你自己的配置修改,很快就能排序完。排序完之后,对排序完的文件按你的内存大小计算一下进行分割然后分别去重再合并就行了。前面的排序就是为了保证重复的行被分到同一个文件中去的,不用担心合并后的文件还有重复。

本文标题:对大文本文件进行去重
本文链接:https://www.nigesb.com/uniq-large-text-files.html
订阅本站:http://www.nigesb.com/feed
转载请注明来源,如果喜欢本站可以Feed订阅本站。

发表评论?

2 条评论。

  1. 要处理的一个大文本的日志文件是有多大,有10GB以至几十GB以上的吗?

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>