Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Сделал блочное чтение. Быстрее стало в 2 с лишним раза. Кто хочет - можете пользоваться. Класс block_read.h Зафиксировал. Там два проекта: uniq-mem - просто добавляет в unordered_set<string> и в конце скидывает его в файл. uniq-crc - с биткартами и CRC32 По скорости одинаково работают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 17:32 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Хопа. Я вернулся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 21:19 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Дима. Посмотрел твой код. Мне понравился этот метод. Хитро придумал. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 21:57 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Далее. Похоже Дима сделал аж 2 реализации. Одну из них я выше называл Naive Hash-table(NHT). Ну что-ж. Отлично. Больше вариантов. Пора как-то навести порядок с названиями. Идентифицировать хотяб. Заведу табличку. AuthorAlgorithmSourceNameCommentsDima-TNaive Hash-table(NHT)uniq-memDima-TCRC32-2-Phase(CRC32-2P)uniq-crcMaytonSplit-Bucket-Processing-2-Phase(SPB2P)spb2pВ разработке..SiemarglBig File Unique Lines Counting(BFULC)siemargl_bighashДокLinux Sorting Utility(LSU)sortЛинуксовая утилита Откоментируйте если чо не так. P.S. Хотя Док не является автором Линуксовой сортировки но он ее усиленно продвигал по сабжу. Поэтому я ставлю докторскую колбасу унификацию под видом Linux sort -u ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 22:33 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
maytonПохоже Дима сделал аж 2 реализации. Одну из них я выше называл Naive Hash-table(NHT). Давно ее сделал 20770314 , просто оформил в проект, чтобы было с чем результаты сравнивать. После замены fgets() на блочное чтение уникальных строк в ripe.db стало чуть меньше, как понял fgets() 0xA на конце оставляет и еще что-то есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 09:11 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Dima T, Не сходится с моим результатом 20772846 Или может файл поменялся. Надо исходников Md5 сверять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 11:49 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Если есть какие-то changes по исходным данным - редактируйте табличку и публикуйте. Я тоже учту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 11:55 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
SiemarglDima T, Не сходится с моим результатом 20772846 Или может файл поменялся. Надо исходников Md5 сверять Я давно заметил что не сходится, потом присмотрелся: у тебя 143393110 строк в файле, у меня 143404062 Файлы разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 12:18 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
ИМХО надо по одним и тем же файлам все прогонять. Я для того и сделал второй вариант чтобы было с чем сравнить. И у меня еще нюанс: пустые строки игнорируются, т.е. любая комбинация 0xA и 0xD считается одним переводом строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 12:22 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
SiemarglDima T, Не сходится с моим результатом 20772846 Или может файл поменялся. Надо исходников Md5 сверять Прогнал твой код со своим файлом, сходится Мой результат: Time 50668 ms. Total unique 26511418 rows. Твой: number of unique strings: 26511419 Время 176 сек. Разница в 1, т.к. я пустые строки пропускаю. PS Ты бы добавил передачу имени файла в параметрах и сохранение результата Можешь мой main() взять за основу Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 12:56 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Siemargl, заменил в твоем коде map на unordered_map время упало с 176 сек. до 122 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 13:04 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Dima TSiemargl, заменил в твоем коде map на unordered_map время упало с 176 сек. до 122 сек. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 13:41 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Последний тестовый файл я добавляю к исследованию. 13Гб в открытом виде. 1.2 миллиарда строк. По некоторым соображениям я не буду давать на него ссылки в форуме (сами понимаете, есть действующие правила). Но дам в личку если кому надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 13:47 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Dima TSiemargl, заменил в твоем коде map на unordered_map время упало с 176 сек. до 122 сек. Это был предусмотренный резерв - хидер уже подключен =) Просто жду, когда будет нормальный набор тестов и Майтон что то напишет. Потом будем красить красоту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 13:49 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Еще немного затюнинговал: Заменил crc32() на хэш попроще. ripe.db проходит за 40 сек вместо 50 :) mayton, затестил триткарту 20780617 , скорость чуть-чуть выше, хоть у проца меньше промахов кэша, но доп.расчеты съели сэкономленное время. Не буду ее добавлять, т.к. по результату первого шага удаляется первая биткарта (512 Мб), а на втором шаге используется только вторая. От второй биткарты тоже не буду избавляться, т.к. при ее использовании 2-3 шаги можно делать частями если за раз не проходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 15:09 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Siemargl, я начал запускать твой алгоритм. Вобщем нужны аргументы command-line. Я добавил. Посмотри коммит https://sourceforge.net/p/sql-ru-uniq/code/16/ Есть еще закомментареные секции печати unique слов и отдельно отчет по статистике. Я не знаю что с этим делать поэтому пока оставил как есть. Вобщем сделай как ты считаешь нужным но чтоб я мог приступить к тестингу с выводом резалта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 16:38 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
mayton, мой обнови. Добавил однопроходный вариант с более агрессивным расходом памяти. ripe.db за 26 сек. Если будет вылетать, то двухпроходный запускается с доп.ключом /L. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 16:41 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Dima T, ого. С вылетанием - это плохо. С точки зрения конечного пользователя. Может задать какую-то логику. Если превышаем 80% от доступной памяти - то откат агрессивного алгоритма и старт экономного. Падающие алгоритмы мне будет сложно тетсировать. Что обрабатывать? Аварийное завершение. Синий экран. Вобщем у меня не получится автоматизация тестирования. По поводу твоего блочного чтения. Я не совсем понял зачем там копирование памяти. Код: plaintext 1. 2. 3. Мне казалось блочное чтение строк можно реализовать без него. Или я ошибаюсь? ХЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 16:58 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
maytonDima T, ого. С вылетанием - это плохо. С точки зрения конечного пользователя. Может задать какую-то логику. Если превышаем 80% от доступной памяти - то откат агрессивного алгоритма и старт экономного. Падающие алгоритмы мне будет сложно тетсировать. Что обрабатывать? Аварийное завершение. Синий экран. Вобщем у меня не получится автоматизация тестирования. Поразмышлял про ключик. Он не спасет, в обоих случаях в памяти будет биткарта + map из повторившихся строк. В первом еще set из строк на хэше которых коллизия была, но их не много. В общем чтобы ключик спасал надо вариант с ключиком допрописывать на еще 2+ проходов. Добавлю обработку исключений при нехватке памяти. maytonПо поводу твоего блочного чтения. Я не совсем понял зачем там копирование памяти. Код: plaintext 1. 2. 3. Мне казалось блочное чтение строк можно реализовать без него. Или я ошибаюсь? ХЗ. Логика такая: есть буфер 1 Мб например, прочитали туда 1Мб и парсим последовательно: наткнулись на конец строки - отдали на обработку и т.д., а когда наткнулись на конец буфера и в нем только начало строки, то начало строки копируется в начало буфера, затем буфер дочитывается из файла. Это только на концах буфера происходит, можно просто размер буфера увеличить чтобы это реже происходило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 17:44 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Dima TЛогика такая: есть буфер 1 Мб например, прочитали туда 1Мб и парсим последовательно: наткнулись на конец строки - отдали на обработку и т.д., а когда наткнулись на конец буфера и в нем только начало строки, то начало строки копируется в начало буфера, затем буфер дочитывается из файла. Это только на концах буфера происходит, можно просто размер буфера увеличить чтобы это реже происходило. Для твоего алгоритма (update CRC32) не обязательно подавать на вход целую строку. Можно в 2 шага. Update head, update tail. Тебе целая строка может только понадобиться на только в той фазе когда ты ее кладешь в хеш-таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 19:42 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
maytonDima TЛогика такая: есть буфер 1 Мб например, прочитали туда 1Мб и парсим последовательно: наткнулись на конец строки - отдали на обработку и т.д., а когда наткнулись на конец буфера и в нем только начало строки, то начало строки копируется в начало буфера, затем буфер дочитывается из файла. Это только на концах буфера происходит, можно просто размер буфера увеличить чтобы это реже происходило. Для твоего алгоритма (update CRC32) не обязательно подавать на вход целую строку. Можно в 2 шага. Update head, update tail. Тебе целая строка может только понадобиться на только в той фазе когда ты ее кладешь в хеш-таблицу. Согласен, но я руководствуюсь принципом изолированности уровней: нижний не знает что делает верхний. Нижний читает, верхний считает. Задача нижнего выдать строку целиком. Так проще, иначе в коде каша получается: нижний должен сообщить что это кусок, а не целое, верхний должен это как-то обрабатывать. И выигрыша в производительности тут доли процента, а то и наоборот потери будут из-за лишних проверок целая/нецелая. PS Добавил обработку исключений нехватки памяти. Пока просто останов и удаление неполного результата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 20:03 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
maytonПоследний тестовый файл я добавляю к исследованию. 13Гб в открытом виде. 1.2 миллиарда строк. По некоторым соображениям я не буду давать на него ссылки в форуме (сами понимаете, есть действующие правила). Но дам в личку если кому надо. Думаю мой код его за один проход переварит даже на твоем ноуте, но если ты сделаешь Код: plaintext 1. то на superbig.txt вылетит. Завалялся файлик с утерянными паспортами 1.2 Гб, для эмуляции недостатка памяти скомпилировал в x86, он обработался, там 100% уникальных строк, пришлось его удвоить чтобы вылетать начало. В общем чем больше уникальных строк, тем меньше надо памяти. Пока думаю что делать если память кончилась, надо как-то задействовать наработанное и перейти к плану Б. PS Интересное наблюдение: Win7 в диспетчере задач показывает *32 на x86 процессах, а Win10 - нет. Похоже MS передумал уходить от x86. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 20:17 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Dima TPS Добавил обработку исключений нехватки памяти. Пока просто останов и удаление неполного результата. Тут вот какое дело. Я думаю что исключение нехватки памяти это очень ПОЗДНЕЕ событие. Мой поинт в том чтобы не ловить эти грабли а заведомо до запуска утилиты оценивать свободное место. Дело в том что механизмы swap и paging-file в Win/Linux подкинут нам медвежью услугу. Они отодвинут это событие далеко в будущее но при этом алгоритм просядет в производительности. Поэтому я полагаю что не стоит ждать этого события а просто подстроиться под "актуальные" условия. Под моим линуксом (Ubuntu на виртуалке VBox) это может выглядеть так. Я вызываю внешний процесс free -m и просто ловлю output и беру значение Mem/Free. Я думаю что это вполне-себе natural-way для Linux программинга. В данном вопросе я не профи. Я не очень силен в архитектуре памяти OS-Linux поэтому если я где-то не прав то пускай опытный линуксоид аргументирует где я не прав и почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 20:31 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
Поясняющая картинка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 20:52 |
|
||
|
Тяпничная унификация
|
|||
|---|---|---|---|
|
#18+
maytonDima TPS Добавил обработку исключений нехватки памяти. Пока просто останов и удаление неполного результата. Тут вот какое дело. Я думаю что исключение нехватки памяти это очень ПОЗДНЕЕ событие. Я про это тоже думал. Как вариант кидать исключение при выводе статистики: Код: plaintext 1. в этот момент оценивать скорость обработки, и если она упала в несколько раз, значит начался своп, можно кидать исключение. Или просто ограничится x86 процессом где 2 Гб наше все. maytonМой поинт в том чтобы не ловить эти грабли а заведомо до запуска утилиты оценивать свободное место. Тут проблема оценивать расход памяти в ходе расчета: std::string забирает доп. память для служебной инфы, контейнеры забирают под массивы хэшей/деревья и т.д. и т.п. Например мой код с unordered_set<string> на ripe.db (проект uniq-mem) съедает 4 Гб оперативки, хотя результат всего 1 Гб. Расход памяти никак не оценить изнутри, т.е. средствами языка. Можно конечно средства ОС вызывать, но это как-то не спортивно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2017, 20:57 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39518633&tid=2018073]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 284ms |

| 0 / 0 |
