Реклама на сайте Advertise with us

Сортировка больших файлов

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 21/01/13 в 13:00       Ответить с цитатойцитата 

Надо на сервере сортировать на уникальность большие текстовые файлы.
Сейчас работает sort -u, но это не быстро как-то.
При этом видно, что практически все ресурсы сервера простаивают.
Есть какие-нибудь современные аналоги сорта?
сервер dual e5 xeon, 96 ram
текстовые файлы содержат строки до 256 символов
размер файлов от 300 до 700 гигабайт
Спасибо

0
 
+ +
WP-Master

С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123


Передовик Master-X (16.02.2015) Передовик Master-X (01.03.2015)
Ссылка на сообщениеДобавлено: 21/01/13 в 13:25       Ответить с цитатойцитата 

Скинь, несколько строк из лога.

-4
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 21/01/13 в 13:30       Ответить с цитатойцитата 

бро, из какого лога?
сорт логов не ведет, принцип его работы виден в папке /tmp

0
 
+ +
WP-Master

С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123


Передовик Master-X (16.02.2015) Передовик Master-X (01.03.2015)
Ссылка на сообщениеДобавлено: 21/01/13 в 13:43       Ответить с цитатойцитата 

atrius: пардон я имел введу txt =).

-4
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 21/01/13 в 14:09       Ответить с цитатойцитата 

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

0
 
+ +
WP-Master

С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123


Передовик Master-X (16.02.2015) Передовик Master-X (01.03.2015)
Ссылка на сообщениеДобавлено: 21/01/13 в 14:37       Ответить с цитатойцитата 

atrius:
вечером отпишу если навояю python скрипт =), для "размер файлов от 300 до 700 гигабайт ", а сколько хоть в нем строк wc -l имя файла.

-4
 



С нами с 15.07.11
Сообщения: 3076
Рейтинг: 198

Ссылка на сообщениеДобавлено: 21/01/13 в 14:47       Ответить с цитатойцитата 

на питоне??? 700Гб?? ну-ну

а можно задачу целиком? только удалить дублирующиеся строки? или сортировка тоже нужна?

0
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 21/01/13 в 14:49       Ответить с цитатойцитата 

500 гиговые файлы быстро не получится в любом случае. Сам по себе sort достаточно эффективен, узкое место - дисковый ввод/вывод от которого с файлами такого размера никуда не денешься. Отсюда вывод: сортировать файлы которые полностью помещаются в памяти. То есть нужно пересмотреть механизм получения этих файлов на предмет их размера: накопился гиг - сортируй. Если это технически сложно или не возможно, а также если такая задача встаёт на регулярной основе правильным будет использовать базу данных.

2
 



С нами с 15.07.11
Сообщения: 3076
Рейтинг: 198

Ссылка на сообщениеДобавлено: 21/01/13 в 14:54       Ответить с цитатойцитата 

если задача - только удалить дубликаты и на сервере реально 96 ram оперативки, есть решение намного быстрее sort'а. Если надо, могу написать на плюсах (бесплатно, люблю такие задачи...)

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 21/01/13 в 15:00       Ответить с цитатойцитата 

где-то у меня был .sh скрипт для такой сортировки
большой файл делится на файлы размером RAM/4 и затем несколько алгоритмов на выбор bubble, merge sort и еще два
я отказался, и решил задачу через LOAD DATA и выборкой нужных мне данных из базы trollface.png

0
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 21/01/13 в 15:32       Ответить с цитатойцитата 

спасибо всем.
расскажу подробнее. разбивать файлики на маленькие - мысль хорошая, но проблема в том, что потом полученные файлы надо между собой уникализировать. в принципе, именно так сорт и работает, вот только совсем не понятно как его научить его полученные маленькие файлы в память грузить и сортировать там?. сорт-же тупо в /tmp складывает файлы. причем память юзает очень ограниченно.
по поводу написать на питоне - спасибо конечно, но вряд ли получится быстрее сорта стандартного.
по поводу с++ - наверное тоже самое, но если интересно, то исходнику буду рад.
родилась идея, но админа нет в онлайне...
может есть способ подмантировать /tmp как ramfs? может это ускорит процесс? P.S. памяти реально 96 гигов, и правда 2 e5-4620 процессора

0
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 21/01/13 в 15:34       Ответить с цитатойцитата 

в добавку.
не пробовал конечно, но есть идея, что вставить файл такого размера в маську с уникальным полем - затея гораздо худшая чем сортировка посредством стандартной утилиты.
и еще добавка
задача - только уникализировать, сортировать по алфавиту или еще как не надо.

0
 
+ +
WP-Master

С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123


Передовик Master-X (16.02.2015) Передовик Master-X (01.03.2015)
Ссылка на сообщениеДобавлено: 21/01/13 в 15:51       Ответить с цитатойцитата 

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

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

Другой более ебанутый вариант, SQL база с но уник значением, записываешь туда она не пропустит наверняка, только база станет весить уже несколько терабайт.

Спасибо за минуса я им так рад.

-4
 



С нами с 15.07.11
Сообщения: 3076
Рейтинг: 198

Ссылка на сообщениеДобавлено: 21/01/13 в 15:56       Ответить с цитатойцитата 

всё проще если не нужна сортировка

1. первый read проход по файлу
в памяти создать хэш
crc32(строки) -> массив вхождений строки (оффсеты)

2. второй read проход файла
читаем входной и пишем в выходной файл
если оффсет "дублирующийся", сохраняем саму строку в памяти (для дальнейшей проверки) и копируем только первое вхождение строки

тут многое зависит от процента дупликатов, если их ОЧЕНЬ много то будут проблемы.
если нет - должно быть сильно быстрее

0
 



С нами с 15.07.11
Сообщения: 3076
Рейтинг: 198

Ссылка на сообщениеДобавлено: 21/01/13 в 16:07       Ответить с цитатойцитата 

если есть такая инфа - размер входного и выходного файла, и wc -l + размер файла, это бы помогло. Просто так в пустоту писать тоже неохота...

0
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 21/01/13 в 16:08       Ответить с цитатойцитата 

Кста, а кто реально минусует?
мне вон тоже минусик проставили =))

0
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 21/01/13 в 16:10       Ответить с цитатойцитата 

wc -l сделаю ближе к вечеру. сейчас уехал до дома

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 21/01/13 в 19:40       Ответить с цитатойцитата 

1. Разбиваешь один большой файл на файлы примерно по N байт.
1.1. Открываешь файл, fseek(N,SEEK_SET), по байту читаешь, пока не найдешь конец строки в позиции N1, сохраняешь 0..N1 в F1.
1.2. fseek(N,SEEK_CUR) ... N2, N1+1..N2 -> F2
...
2. Сортируешь файлы F1..Fm любым способом
3. Сливаешь отсортированные маленькие файлы в один большой
3.1. Открываешь все файлы, указатель на начало.
3.2. Считываешь из каждого файла первую строку.
3.3. Сравниваешь строки и пишешь на выход самую "маленькую".
3.4. Из файла, строка которого пошла на выход, читаешь новую строку.
3.5. Переход на 3.3

Так можно сортировать файлы любого объема. Сливать все куски за один проход необязательно, можно и по два за проход сливать, на результат это не повлияет

apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only

0
 



С нами с 15.07.11
Сообщения: 3076
Рейтинг: 198

Ссылка на сообщениеДобавлено: 22/01/13 в 00:22       Ответить с цитатойцитата 

uname_ писал:
всё проще если не нужна сортировка

тут многое зависит от процента дупликатов, если их ОЧЕНЬ много то будут проблемы.
если нет - должно быть сильно быстрее


нет, не получается быстрее, выходит практически 1-1 со стандартным sort icon_smile.gif

кстати у меня на ubuntu 12.10 sort использует несколько ядер процессора, а памяти ему много и не надо...

2
 
+ +
WP-Master

С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123


Передовик Master-X (16.02.2015) Передовик Master-X (01.03.2015)
Ссылка на сообщениеДобавлено: 22/01/13 в 00:40       Ответить с цитатойцитата 

uname_: если выгрузить частично в память то будет шустрей или тот трюх с хешами.

-2
 



С нами с 15.07.11
Сообщения: 3076
Рейтинг: 198

Ссылка на сообщениеДобавлено: 22/01/13 в 00:52       Ответить с цитатойцитата 

Я вот походил, подумал - короче, всё зависит от циферок, о которых я спрашивал.

Если дубликатов < 1-2%, то можно сделать сильно быстрее, и я придумал как.

Если дубликатов больше, то без сортировки не обойтись, и c наскока быстрее не сделаешь... юниксовый сорт уже наверное лет 30 пилят icon_smile.gif

2
 
+ +
WP-Master

С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123


Передовик Master-X (16.02.2015) Передовик Master-X (01.03.2015)
Ссылка на сообщениеДобавлено: 22/01/13 в 01:17       Ответить с цитатойцитата 

uname_: facepalm.gif что да, то да, 10 лет назад народ ждал что вот-вот запилят, а воз и тут посей день.

-2
 



С нами с 15.07.11
Сообщения: 3076
Рейтинг: 198

Ссылка на сообщениеДобавлено: 22/01/13 в 01:48       Ответить с цитатойцитата 

Да я б не сказал, что он медленный. 400 мегабайт сортирует за 2 минуты (ssd). Это плохо разве? Быстрее хрен сделаешь...

1
 
+ +
WP-Master

С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123


Передовик Master-X (16.02.2015) Передовик Master-X (01.03.2015)
Ссылка на сообщениеДобавлено: 22/01/13 в 02:07       Ответить с цитатойцитата 

uname_: только если выгружать пачку в память.

-3
 



С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506

Ссылка на сообщениеДобавлено: 22/01/13 в 03:21       Ответить с цитатойцитата 

уникальные строки - это значит строить индекс. а кто может строить индекс по строке быстрее СУБД?
самописный скрипт точно вряд ли.
так что я за базу. по крайней мере надо сравнить производительность с sort'ом.

2
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »