LINUX.ORG.RU

Удалить дубли из огромного файла

 


0

3

Добрый день! Есть файл вида:

[root@master STATS_RAID0]# cat file1 | head -n 10 
835903804
835903804
143903655
159156315
167873790
835903804
835903804
112101483
167873738
819435027

Строк в нем:

[root@master STATS_RAID0]# cat  file1 |  wc -l
455702491

Судя по всему 30% там дубли, нужно на выходе иметь файл с уникальными записями.

Запрос вида:

cat  file1 | sort -u  >file_unic.txt
Результата не дает, висит без ответа... Нужно что-то производельное..


Ответ на: если много памяти, то от zolden

Спасибо, памяти более 100Gb, файл положил на RAID0. Считатете awk быстрее sort ?

Сейчас пытается отрабоать sort, но не ясно что он делает:

32249 root       20   0 17.5G 17.2G   868 S 216. 13.6  1h06:14 sort -u file1
32691 root       20   0 17.5G 17.2G   868 R 100. 13.6  2:47.25 sort -u file1                                                                               
32693 root       20   0 17.5G 17.2G   868 S 51.1 13.6  2:38.84 sort -u file1 
32692 root       20   0 17.5G 17.2G   868 S 36.4 13.6  2:33.93 sort -u file1
32695 root       20   0 17.5G 17.2G   868 S  9.0 13.6  2:38.18 sort -u file1
32690 root       20   0 17.5G 17.2G   868 S  2.4 13.6  2:34.58 sort -u file1
32689 root       20   0 17.5G 17.2G   868 S  2.4 13.6  2:38.87 sort -u file1
32694 root       20   0 17.5G 17.2G   868 S  0.5 13.6  2:35.47 sort -u file1
Dr0id
() автор топика

Здесь cat не нужен.

sin_a ★★★★★
()

Можно попробовать ухищрения, типа

grep ^1 file1 | sort -u 
grep -v ^1 file1 | sort -u 

sin_a ★★★★★
()

я бы на python это сделал, но уж больно много файлов, чтобы целиком это в память грузить...

odii
()

Это разовая операция?

Если такое нужно часто делать, может проще будет на С написать сортировку/дедупликацию? Зная что там цифры фиксированного размера можно наверное выиграть в скорости у sort/uniq

anonymous
()
Ответ на: комментарий от anonymous

Ещё, зная, что там только цифры, можно уложиться в ~14G по памяти.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от anonymous

Да, это на один раз. Постоянно такое делать к счастью не нужно.

Dr0id
() автор топика

Попробуй так:

sort -S 2G -u < file1 > file_unic.txt
-S, --buffer-size=SIZE
    use SIZE for main memory buffer

joy4eg ★★★★★
()

посмотреть на ключи --numeric-sort, --temporary-directory, --batch-size, --parallel

anonymous
()

или разбить на мелкие файлы, отсортировать, а затем воспользоваться --merge

anonymous
()

455 миллионов? Так это не очень много еще.
Странно, что никто не посоветовал LC_ALL=C.

LC_ALL=C sort -u file.in > file.out
За пару часов сделает, зависит от железа.

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

многопоточный греп для одного файла? так затык будет в чтении с диска скорее, чем обработка регекспа

sdio ★★★★★
()
Ответ на: комментарий от sdio

Не будет. Обработка регекспов штука затратная. Иначе не надо было бы базы данных придумывать.

Deleted
()
Ответ на: комментарий от Deleted

Обработка регекспов штука затратная. Иначе не надо было бы базы данных придумывать.

Ога! Базы данных это только поиск?!

sdio ★★★★★
()
Ответ на: комментарий от Deleted

Чтоб далеко не ходить,

Там оптимизировали работу с юникодом. Регекспы тут не причем

sdio ★★★★★
()
#!/usr/bin/perl -w
use strict;
my $origfile = shift;
my $outfile = "no_dupes_" . $origfile;
my %hTmp;
open (IN, "<$origfile") or die "Couldn't open input file: $!";
open (OUT, ">$outfile") or die "Couldn't open output file: $!";
while (my $sLine = <IN>) {
next if $sLine =~ m/^\s*$/; #remove empty lines
#Without the above, still destroys empty lines except for the first one.
print OUT $sLine unless ($hTmp{$sLine}++);
}
close OUT;
close IN;

# Вариант 2
# use List::MoreUtils "uniq";my @unique = uniq @all;

# Вариант 3
# my @new_list; # массив куда будут помещены "отфильтованные" значения
# my @list; #исходный массив
# my %seen; #хеш для работы
# @new_list = grep {$_ && !$seen{$_}++} @list;

# Вариант 4
# %hash = map { $_ => 1} @src;
# @dst = keys %hash; 
Attila ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.