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

Смотрите. Я готов добавить ещё одну графу мультипоточности в наши будущие бенчмарки..

Но будем ли мы все алгоритмы укомплектовывать этой опцией?
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521106
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T,

Смотрите. Я готов добавить ещё одну графу мультипоточности в наши будущие бенчмарки..

Но будем ли мы все алгоритмы укомплектовывать этой опцией?
Сомневаюсь что все будут иметь многопоточный вариант.
Думаю для тестов основным надо считать однопоточный вариант. Его и мерить.

Если кто предложит дополнительно многопоточный - можно тоже померить. Доп.графы не надо, достаточно просто пометки MT в названии алгоритма.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521391
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникли мысли по поводу расхода памяти. Насколько мы рационально используем
пространство?

Я вспомнил свои эксперименты в студенчестве.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct OptionalPointer {
    union
    {
        char *s;
        char c[32];
    };
};

struct Node {
    uint32_t mask;
    OptionalPointer *p1;
    OptionalPointer *p2;
    // .....
    OptionalPointer *p32;
};



Я обратил внимание на то что в древовидных структурах наибольший оверхед
занимают листовые вершины. Основное мясо листовых узлов - указатели.
И я пытался переиспользовать пространство указателя. Для коротких строк
(меньше 31 символов) я переиспользовал место указателя.

Я также заметил что у нас есть файлы типа passport. И у них весьма резкая
гистограмма длины. 11 символов на каждый элемент. Это можно использовать.
Я не просто так мерял 97-й перцентиль. Эта величина должна помочь в выяснении
закономерностей. Может кто-то и придумает регулярную структуру данных.
Не такую общую как unordered_map.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521416
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, без оптимизаций тайминги на паспортах такие (~3GHz):
(да, там нет повторов - совсем забыл, что отключал инкремент позиции при чтении файла)

- загрузка и заполнение структуры (много реаллоков - буду тюнить) ~40c;
- отсеивание дублей по второму 32 битному хешу ~10c;
- память 2,5GB

много/мало - как у вас? )

Насколько мы рационально используем пространство?да, думаю над своим аллокатором под эту задачу.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521419
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенчмарки буду гнать на всей коллекций файлов. Не только на паспортах
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521425
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, хорошо!, только у мну те что есть, отличаются от табличных )

Код: plaintext
1.
2.
3.
4.
ripe.db (5 462 799 419)
- load: ~55s
- calc: ~8s
- ram:  ~2.5GB
- result:  9701336 / 107196073 / 133709268 / 143410604   (zero / copy / valid / total)
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521493
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMИтак, без оптимизаций тайминги на паспортах такие (~3GHz):
(да, там нет повторов - совсем забыл, что отключал инкремент позиции при чтении файла)

- загрузка и заполнение структуры (много реаллоков - буду тюнить) ~40c;
- отсеивание дублей по второму 32 битному хешу ~10c;
- память 2,5GB

много/мало - как у вас? )
Для паспортов мне 600 Мб требуется.

Выше обсуждали что в процессе надо контролировать расход памяти, в итоге остановились на опросе ОС занимаемой процессом памяти mem_used.h
Т.к. теоретически может попасться такой файл что съест всю память. Тогда или прога свопиться начнет или ОС перестанет выделять память для твоего процесса, т.е. вылет с исключением std::bad_alloc.

PS У mayton`а есть супер-файлик 20783786
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521509
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM, ripe.db возможно обновляется. Поэтому данные и будут отличаться. Это норм.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521520
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS У mayton`а есть супер-файлик 20783786
Кстати я-бы проверил в сколько максимальное количество buckets может работать стандартная
реализация std::*_map.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521526
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TPS У mayton`а есть супер-файлик 20783786
Кстати я-бы проверил в сколько максимальное количество buckets может работать стандартная
реализация std::*_map.
Нам хватит
Код: plaintext
1.
2.
3.
max_size = 576460752303423487
max_bucket_count = 1152921504606846975
max_load_factor = 1


http://www.cplusplus.com/reference/unordered_map/unordered_map/max_size/
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39521748
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть супер-файлик 20783786 щёлоч в профиле, спасибо
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39522079
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
max_bucket_count = 1152921504606846975



Отлично.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39522092
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько мыслей. По поводу хеш-таблиц. Есть у меня мнение что они не оптимальны
для нашей задачи. Например, взять паспорта. У них - ограниченная длина. 11 символов.
Мы для решения в Naive Hash-Table аллоцируем 1 объект std::string. И ясен пень - это не на стеке.
Это в динамической памяти процесса. Сколько там будет аллоцировано? ХЗ. Platform dependent.
Я очень верю в С++ и его способности хорошо "закатывать" шаблонизированный код в
эффективный бинарный. Но что можно сказать об аллокации памяти?

Может мы укрупним единицу аллокации? Пускай там лежит пара строк.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39522095
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу тех справочников и выгрузок где есть ярко выраженный префиксный порядок.
Ох... я чувствую что иду по неверному пути Паниковского Базиста. Но я думаю
о том чтобы прогрузить их в RadixTree/RTrie, и прочик Ахо-Корасики.

Хотя-б для начала замерять потребляемую память. Маловероятно что это "стрельнет"
для всех видов наших данных. Но у нас есть хорошие выгрузки где префикс просто
сам по себе напрашивается.

Кстати идею с префиксом можно расширить и на хеш-таблицы.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39522462
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожет мы укрупним единицу аллокации? Пускай там лежит пара строк.
ИМХО Так мы до самодельного архиватора дойдем :)

Нашел еще одно тормозное место: fwrite(). Заменил на блочную запись ( block_write.h ), стало чуть быстрее: паспорта были 18 сек. стали 14 сек.

Пытаюсь многопоточный вариант сделать на акторах. Обнаружилась проблема: при чтении быстрее обработки память занимает очередь из прочитанного, но необработанного. Тупо все в очереди ставить - не вариант.
Параллелить можно не только чтение, так тут не особо запараллелишь. Запараллелил расчет хэшей, т.к. без разницы в каком порядке прочитанные блоки на последующую обработку попадут.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39523619
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonМожет мы укрупним единицу аллокации? Пускай там лежит пара строк.
ИМХО Так мы до самодельного архиватора дойдем :)
Размышляю над архиватором, возможно оно может пригодится для получения хэша: строим словарь, общий для всего множества, и далее начало пожатой строки используем как хэш. Например паспорт скорее всего целиком в 32 бита поместится после сжатия: 105 млн. строк в 344 Мб, т.е. ~3.3 байта на строку. С ripe.db статистика похуже: 180 Мб (пожал только уникальные) для 30 млн. строк, т.е. 6 байт на строку.
Кроме того можно сжатыми строками оперировать, например во временные файлы их писать. Текст жмется в 4-6 раз.

Правда тут есть большой минус в том что первый проход надо будет делать для построения словаря.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39523993
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TDima Tпропущено...

ИМХО Так мы до самодельного архиватора дойдем :)
Размышляю над архиватором, возможно оно может пригодится для получения хэша: строим словарь, общий для всего множества, и далее начало пожатой строки используем как хэш. Например паспорт скорее всего целиком в 32 бита поместится после сжатия: 105 млн. строк в 344 Мб, т.е. ~3.3 байта на строку. С ripe.db статистика похуже: 180 Мб (пожал только уникальные) для 30 млн. строк, т.е. 6 байт на строку.
Кроме того можно сжатыми строками оперировать, например во временные файлы их писать. Текст жмется в 4-6 раз.

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

Паспорта конечно можно перевести в целые числа. Но как такой метод потом включать в общий поток тестирования? Непонятно.

Или будет отдельно бранч узких алгоритмов.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39525122
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал многопоточный вариант, правда не полноценный, а только однопроходную часть, алгоритм тот же, но с акторами :) Сделал чтение блоками 256 Kб, запараллелил разбор блока на строки и расчет хэшей строк, остальное как было.
Исходники завтра покажу, после причесывания.

Результаты такие (оба варианта работали в одинаковом режиме, т.е. в один проход чтения файла)

I7-6700K, DDR4, 4 ядра без HT, 4 потока:
ФайлОднопоточноМногопоточнопаспорта (1.2 Гб)12.9 сек.4.1 сек.ripe.db (5.2 Гб)24.4 сек.7.6 сек.
I7-3770K, DDR3, 4 ядра c HT, 8 потоков
ФайлОднопоточноМногопоточнопаспорта (1.2 Гб) 15.9 сек.5.6 сек.ripe.db (5.2 Гб) 27.9 сек.9.2 сек.

PS Т.к. памяти у меня много и все там закэшировано, то максимальное чтение удалось выжать 2+ Гб/сек. Это просто чтение, разбор на строки, подсчет количества строк и контрольной суммы XOR(хэш строк). Полноценная работа 500 Мб/сек максимум, т.е IO ни при чем, есть куда тюнинговать алгоритм.

PPS Амдал не дает больше чем в 3 раза ускориться :(
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39525163
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ого круть.

Только я-бы протестировал "холодный" старт. Тоесть условия при которых
файл еще ни разу не читался.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39525199
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Холодный старт. Перезагрузка перед каждым замером.

I7-3770K, DDR3, 4 ядра c HT, 8 потоков, SSD SATA3 (SanDisk SDSSDHII120G)
ФайлОднопоточноМногопоточноПодсчет строкпаспорта (1.2 Гб) 17.7 сек. 6.1 сек.3.4 сек.ripe.db (5.2 Гб) 29.5 сек. 18.3 сек.15.0 сек.
Третья колонка: просто чтение, разбор на строки, подсчет количества строк и контрольной суммы XOR(хэш строк).
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39525211
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Залил исходник к себе в акторы uniq.cpp , как еще один пример использования акторов.

Дублировать в местную репку? Он не полностью дублирует однопоточный вариант, не стал делать контроль за памятью и переключение на "план Б" с несколькими проходами когда памяти не хватает.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39525223
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай зальем. Будет больше направлений развития.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39525298
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Залил uniq-mt.cpp
Бинарники тоже.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39525373
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonВозникли мысли по поводу расхода памяти. Насколько мы рационально используем
пространство?

Я вспомнил свои эксперименты в студенчестве.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct OptionalPointer {
    union
    {
        char *s;
        char c[32];
    };
};

struct Node {
    uint32_t mask;
    OptionalPointer *p1;
    OptionalPointer *p2;
    // .....
    OptionalPointer *p32;
};



Я обратил внимание на то что в древовидных структурах наибольший оверхед
занимают листовые вершины. Основное мясо листовых узлов - указатели.
И я пытался переиспользовать пространство указателя. Для коротких строк
(меньше 31 символов) я переиспользовал место указателя.

Я также заметил что у нас есть файлы типа passport. И у них весьма резкая
гистограмма длины. 11 символов на каждый элемент. Это можно использовать.
Я не просто так мерял 97-й перцентиль. Эта величина должна помочь в выяснении
закономерностей. Может кто-то и придумает регулярную структуру данных.
Не такую общую как unordered_map.

Я когда программировал на С++, лет 15 - 20 назад , на этой теме
ускорил очередную версию приложения ( библиотеки) раз в 100,
за счет оптимизации вызовов аллокации памяти для коротких строк.
...
Рейтинг: 0 / 0
Тяпничная унификация
    #39533017
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UP. Приношу свои извенения за праздность и таймаут. Об этой задаче я не забыл.
Я о ней помню. И думаю.

Мои размышления о сравнении алгоритмов унесли меня в такую даль.... В нейронные
сети. И тому подобное. Вобщем я страдал прокрастинацией и думал о шаге №2 (анализ
результатов) и в уме построил отдельную задачу которая должна брать в анализ
таблицу результатов и методом нечеткой логики выбирать нужный алгоритм автоматически
исходя из признаков самого текстового файла. Где признаки - есть сэмпл. Выборка
первых 100-1000 строк.

И из-за этой прокрастинации а также из-за чортовых шахмат я провтыкал уже почти месяц.

Но я не забыл. Я помню. Ждите....
...
Рейтинг: 0 / 0
25 сообщений из 227, страница 9 из 10
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная унификация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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