powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная унификация
25 сообщений из 227, страница 6 из 10
Тяпничная унификация
    #39518366
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал блочное чтение. Быстрее стало в 2 с лишним раза. Кто хочет - можете пользоваться. Класс block_read.h

Зафиксировал. Там два проекта:
uniq-mem - просто добавляет в unordered_set<string> и в конце скидывает его в файл.
uniq-crc - с биткартами и CRC32

По скорости одинаково работают.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518432
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хопа. Я вернулся.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518455
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима. Посмотрел твой код. Мне понравился этот метод. Хитро придумал.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	bool getset(size_t pos) {
		size_t idx = pos >> 5;
		assert(idx <= len);
		uint32_t mask = 1 << (pos & 31);
		bool ret = (bitmap[idx] & mask) != 0;
		bitmap[idx] |= mask;
		return ret;
	}
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518459
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее. Похоже Дима сделал аж 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
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518538
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПохоже Дима сделал аж 2 реализации. Одну из них я выше называл Naive Hash-table(NHT).
Давно ее сделал 20770314 , просто оформил в проект, чтобы было с чем результаты сравнивать.

После замены fgets() на блочное чтение уникальных строк в ripe.db стало чуть меньше, как понял fgets() 0xA на конце оставляет и еще что-то есть.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518560
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Не сходится с моим результатом 20772846

Или может файл поменялся. Надо исходников Md5 сверять
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518562
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть какие-то changes по исходным данным - редактируйте табличку и публикуйте. Я тоже учту.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518570
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglDima T,

Не сходится с моим результатом 20772846

Или может файл поменялся. Надо исходников Md5 сверять
Я давно заметил что не сходится, потом присмотрелся:
у тебя 143393110 строк в файле, у меня 143404062

Файлы разные.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518572
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО надо по одним и тем же файлам все прогонять. Я для того и сделал второй вариант чтобы было с чем сравнить.
И у меня еще нюанс: пустые строки игнорируются, т.е. любая комбинация 0xA и 0xD считается одним переводом строки.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518580
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
int main(int argc, char** argv) {
	if(argc <= 2) {
		printf("\n\n Select unique rows from text file. \n\n Command line:\n uniq1 source_file result_file\n");
		return 0;
	}
	printf("Compile %s %s\n", __DATE__, __TIME__);
	read_file(argv[1], argv[2]);
	crc32_t crc = file_checksum(argv[2]);
	return 0;
}

...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518582
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, заменил в твоем коде map на unordered_map время упало с 176 сек. до 122 сек.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518592
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSiemargl, заменил в твоем коде map на unordered_map время упало с 176 сек. до 122 сек.
+1
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518595
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний тестовый файл я добавляю к исследованию. 13Гб в открытом виде.
1.2 миллиарда строк. По некоторым соображениям я не буду давать на него
ссылки в форуме (сами понимаете, есть действующие правила). Но дам в личку
если кому надо.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518598
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSiemargl, заменил в твоем коде map на unordered_map время упало с 176 сек. до 122 сек.
Это был предусмотренный резерв - хидер уже подключен =)

Просто жду, когда будет нормальный набор тестов и Майтон что то напишет. Потом будем красить красоту.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще немного затюнинговал: Заменил crc32() на хэш попроще.
ripe.db проходит за 40 сек вместо 50 :)

mayton, затестил триткарту 20780617 , скорость чуть-чуть выше, хоть у проца меньше промахов кэша, но доп.расчеты съели сэкономленное время.
Не буду ее добавлять, т.к. по результату первого шага удаляется первая биткарта (512 Мб), а на втором шаге используется только вторая.
От второй биткарты тоже не буду избавляться, т.к. при ее использовании 2-3 шаги можно делать частями если за раз не проходит.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518632
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, я начал запускать твой алгоритм. Вобщем нужны аргументы command-line. Я добавил.

Посмотри коммит https://sourceforge.net/p/sql-ru-uniq/code/16/

Есть еще закомментареные секции печати unique слов и отдельно отчет по статистике.
Я не знаю что с этим делать поэтому пока оставил как есть. Вобщем сделай как ты считаешь
нужным но чтоб я мог приступить к тестингу с выводом резалта.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518633
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, мой обнови. Добавил однопроходный вариант с более агрессивным расходом памяти. ripe.db за 26 сек.
Если будет вылетать, то двухпроходный запускается с доп.ключом /L.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518638
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ого. С вылетанием - это плохо. С точки зрения конечного пользователя. Может задать
какую-то логику. Если превышаем 80% от доступной памяти - то откат агрессивного алгоритма
и старт экономного.

Падающие алгоритмы мне будет сложно тетсировать. Что обрабатывать? Аварийное завершение.
Синий экран. Вобщем у меня не получится автоматизация тестирования.

По поводу твоего блочного чтения. Я не совсем понял зачем там копирование памяти.

Код: plaintext
1.
2.
3.
		if (p == buf_end) { // конец буфера, строка не полная. Перенос в начало и дочитывание.
			size_t s = buf_end - cur;
			if (cur != buf_end) memcpy(buf, cur, s);



Мне казалось блочное чтение строк можно реализовать без него. Или я ошибаюсь? ХЗ.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518648
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T, ого. С вылетанием - это плохо. С точки зрения конечного пользователя. Может задать
какую-то логику. Если превышаем 80% от доступной памяти - то откат агрессивного алгоритма
и старт экономного.

Падающие алгоритмы мне будет сложно тетсировать. Что обрабатывать? Аварийное завершение.
Синий экран. Вобщем у меня не получится автоматизация тестирования.
Поразмышлял про ключик. Он не спасет, в обоих случаях в памяти будет биткарта + map из повторившихся строк. В первом еще set из строк на хэше которых коллизия была, но их не много.
В общем чтобы ключик спасал надо вариант с ключиком допрописывать на еще 2+ проходов.
Добавлю обработку исключений при нехватке памяти.
maytonПо поводу твоего блочного чтения. Я не совсем понял зачем там копирование памяти.

Код: plaintext
1.
2.
3.
		if (p == buf_end) { // конец буфера, строка не полная. Перенос в начало и дочитывание.
			size_t s = buf_end - cur;
			if (cur != buf_end) memcpy(buf, cur, s);



Мне казалось блочное чтение строк можно реализовать без него. Или я ошибаюсь? ХЗ.
Логика такая: есть буфер 1 Мб например, прочитали туда 1Мб и парсим последовательно: наткнулись на конец строки - отдали на обработку и т.д., а когда наткнулись на конец буфера и в нем только начало строки, то начало строки копируется в начало буфера, затем буфер дочитывается из файла.
Это только на концах буфера происходит, можно просто размер буфера увеличить чтобы это реже происходило.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518661
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЛогика такая: есть буфер 1 Мб например, прочитали туда 1Мб и парсим последовательно: наткнулись на конец строки - отдали на обработку и т.д., а когда наткнулись на конец буфера и в нем только начало строки, то начало строки копируется в начало буфера, затем буфер дочитывается из файла.
Это только на концах буфера происходит, можно просто размер буфера увеличить чтобы это реже происходило.
Для твоего алгоритма (update CRC32) не обязательно подавать на вход целую строку. Можно в 2 шага.
Update head, update tail.

Тебе целая строка может только понадобиться на только в той фазе когда ты ее кладешь в хеш-таблицу.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TЛогика такая: есть буфер 1 Мб например, прочитали туда 1Мб и парсим последовательно: наткнулись на конец строки - отдали на обработку и т.д., а когда наткнулись на конец буфера и в нем только начало строки, то начало строки копируется в начало буфера, затем буфер дочитывается из файла.
Это только на концах буфера происходит, можно просто размер буфера увеличить чтобы это реже происходило.
Для твоего алгоритма (update CRC32) не обязательно подавать на вход целую строку. Можно в 2 шага.
Update head, update tail.

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

PS Добавил обработку исключений нехватки памяти. Пока просто останов и удаление неполного результата.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518665
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПоследний тестовый файл я добавляю к исследованию. 13Гб в открытом виде.
1.2 миллиарда строк. По некоторым соображениям я не буду давать на него
ссылки в форуме (сами понимаете, есть действующие правила). Но дам в личку
если кому надо.
Думаю мой код его за один проход переварит даже на твоем ноуте, но если ты сделаешь
Код: plaintext
1.
copy big.txt+big.txt superbig.txt


то на superbig.txt вылетит.

Завалялся файлик с утерянными паспортами 1.2 Гб, для эмуляции недостатка памяти скомпилировал в x86, он обработался, там 100% уникальных строк, пришлось его удвоить чтобы вылетать начало. В общем чем больше уникальных строк, тем меньше надо памяти.

Пока думаю что делать если память кончилась, надо как-то задействовать наработанное и перейти к плану Б.

PS Интересное наблюдение: Win7 в диспетчере задач показывает *32 на x86 процессах, а Win10 - нет. Похоже MS передумал уходить от x86.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518667
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS Добавил обработку исключений нехватки памяти. Пока просто останов и удаление неполного результата.
Тут вот какое дело. Я думаю что исключение нехватки памяти это очень ПОЗДНЕЕ событие.
Мой поинт в том чтобы не ловить эти грабли а заведомо до запуска утилиты оценивать свободное
место. Дело в том что механизмы swap и paging-file в Win/Linux подкинут нам медвежью услугу. Они отодвинут
это событие далеко в будущее но при этом алгоритм просядет в производительности. Поэтому
я полагаю что не стоит ждать этого события а просто подстроиться под "актуальные" условия.

Под моим линуксом (Ubuntu на виртуалке VBox) это может выглядеть так. Я вызываю внешний процесс free -m и просто ловлю output
и беру значение Mem/Free. Я думаю что это вполне-себе natural-way для Linux программинга.

В данном вопросе я не профи. Я не очень силен в архитектуре памяти OS-Linux поэтому если я где-то не прав
то пускай опытный линуксоид аргументирует где я не прав и почему.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518670
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясняющая картинка
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39518671
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TPS Добавил обработку исключений нехватки памяти. Пока просто останов и удаление неполного результата.
Тут вот какое дело. Я думаю что исключение нехватки памяти это очень ПОЗДНЕЕ событие.
Я про это тоже думал. Как вариант кидать исключение при выводе статистики:
Код: plaintext
1.
if ((cnt & 0xFFFFF) == 0) printf(...


в этот момент оценивать скорость обработки, и если она упала в несколько раз, значит начался своп, можно кидать исключение. Или просто ограничится x86 процессом где 2 Гб наше все.

maytonМой поинт в том чтобы не ловить эти грабли а заведомо до запуска утилиты оценивать свободное
место.
Тут проблема оценивать расход памяти в ходе расчета: std::string забирает доп. память для служебной инфы, контейнеры забирают под массивы хэшей/деревья и т.д. и т.п. Например мой код с unordered_set<string> на ripe.db (проект uniq-mem) съедает 4 Гб оперативки, хотя результат всего 1 Гб.
Расход памяти никак не оценить изнутри, т.е. средствами языка. Можно конечно средства ОС вызывать, но это как-то не спортивно.
...
Рейтинг: 0 / 0
25 сообщений из 227, страница 6 из 10
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная унификация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]