Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367

Высокопроизводительная хэш-таблица

17.07.2015, 15:17. Показов 1542. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто-нибудь знает проверенную в бою готовую реализацию высокопроизводительной хэш-таблицы или хотя бы материалы какие?

Требования:
  1. multiple readers / multiple writers
  2. должна отлично справляться со следующими нагрузками: avg reads/writes, intensive writes
  3. хорошее scalability
  4. желательно cache-friendly
  5. адекватное влияние load factor, адекватный rehashing, адекватное потребление памяти.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2015, 15:17
Ответы с готовыми решениями:

Описать класс "хэш-таблица", используя unordered_set и заданную хэш-функцию
Здравствуйте. Есть класс объектов и ключ сравнения: #pragma once #include <iostream> #include <vector> #include <list>...

Хэш таблица
Как работает метод цепочек, для разрешения коллизий в хэш таблице?

Хэш таблица
Подскажите, пожалуйста, как сделать хэш-таблицу в которой у каждого элемента есть шесть полей.(например Имя фамилия возраст...). Что бы...

10
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.07.2015, 16:27
ct0r, этот не подошел? http://www.boost.org/doc/libs/... tiset.html
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
17.07.2015, 16:34
std::unordered_map + std::mutex или boost::shared_lock по ситуации точно не подходят?
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
17.07.2015, 19:08
NoMasters, а также std::shared_lock: http://en.cppreference.com/w/c... hared_lock
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
17.07.2015, 20:45  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
этот не подошел?
Интрузивные контейнеры из коробки это хорошо, но как можно реализовать надстройку множества одновременных чтений и записей без грубой блокировки?

Цитата Сообщение от NoMasters Посмотреть сообщение
std::unordered_map + std::mutex или boost::shared_lock по ситуации точно не подходят?
Ситуация такая. Пишу демон.

Есть собственно эта самая таблица размером в несколько сотен Гб. При внешних запросах в несколько тысяч RPS мы лезем в эту таблицу (как раз там сейчас read-write мьютекс, но не стандартной, а внутренней реализации, с приоритетом читателям) и отдаем ответ. Одновременно в демон поступают новые данные через сислог, мы в онлайн режиме обновляем таблицу, но с некоторой допустимой ошибкой. Поэтому периодически нам нужно эту таблицу полностью пересчитывать. Поскольку демон должен всегда и максимально быстро отвечать на запросы, то пересчет делается в такую же отдельную таблицу, на которую мы затем мгновенно переключаемся. Но на время пересчета приостанавливается чтение сислога, так как они используют одни и те же данные. Нужно сократить время этого пересчета до минимума. Я распараллелил пересчет на 16 (по кол-ву ядер) потоков-производителей, которые пачками пихают данные в лок-фри очередь, откуда их одновременно забирает поток-потребитель и записывает в таблицу. Но это все равно не так быстро, как хотелось бы. Если бы эти 16 потоков сразу писали в таблицу, то было бы куда лучше. Заодно из-за смены структуры данных автоматом улучшилось бы чтение сислога и выдача ответов.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.07.2015, 20:53
Цитата Сообщение от ct0r Посмотреть сообщение
Интрузивные контейнеры из коробки это хорошо, но как можно реализовать надстройку множества одновременных чтений и записей без грубой блокировки?
В конференции буста пишут, что это нетривиально. Оттуда:
So, my question: is it possible to use bucket_traits to have a lock per bucket?

> I don't think so. We can obtain the bucket from the value but there is
> no insert function taking a bucket as argument. That would be an easy way
> to get some paralelism, at least for insertions. Intrusive could guarantee
> that the bucket search can be done in parallel and the insert_in_bucket
> function could be called with a locked mutex.
>
> We would need an erase_from_bucket function that does not return an
> iterator to the next remaining object, as that could provoke race
> conditions (the next remaining object can be in a different bucket).
>
> It's an interesting optimization for Intrusive, but I'm afraid it's not
> trivial.
Может тогда это подойдет: https://www.threadingbuildingb... ap_cls.htm

Или это: https://msdn.microsoft.com/en-... 50089.aspx
2
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
17.07.2015, 22:00  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В конференции буста пишут, что это нетривиально. Оттуда:
Я так и думал, что это не так просто. Когда читал документацию, я видел bucket_traits, но не увидел, куда там можно взять и вставить блокировку по бакетам. Спасибо за подтверждение.

Цитата Сообщение от DrOffset Посмотреть сообщение
Может тогда это подойдет: https://www.threadingbuildingb... ap_cls.htm
Увы. TBB был бы неплохой дешевый стартовый вариант на попробовать, но... из-за одной структуры тащить всю библиотеку в репозиторий - это минус. Хотя это не главное. Там же GPLv2, поэтому нужна коммерческая лицензия, а стоит она недешево.

Цитата Сообщение от DrOffset Посмотреть сообщение
Увы. ОС FreeBSD.

Пока думаю на эту тему.
https://github.com/efficient/libcuckoo
http://www.cs.princeton.edu/~m... osys14.pdf
http://excess-project.eu/publi... _ICDCS.pdf
1
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
17.07.2015, 22:13
Цитата Сообщение от ct0r Посмотреть сообщение
Но на время пересчета приостанавливается чтение сислога, так как они используют одни и те же данные.
Не очень понятно, какие данные совместно используются. Выходная таблица? Что мешает писать в ту же локфри очередь, пока идет пересчет?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.07.2015, 22:20
ct0r, кстати, существуют пропозалы подобного контейнера в новый стандарт С++.
Вот еще что нашлось:
https://github.com/tamanyan/lmn-concurrent-hashmap (на С)
https://github.com/noporpoise/jelly-hash (тоже на C) на базе этого https://code.google.com/p/ulib/
https://code.google.com/p/nbds/
https://github.com/facebook/fo... cHashMap.h (на C++)

на всякий случай: https://www.usenix.org/legacy/... iplett.pdf
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
18.07.2015, 16:09  [ТС]
Цитата Сообщение от NoMasters Посмотреть сообщение
Не очень понятно, какие данные совместно используются. Выходная таблица? Что мешает писать в ту же локфри очередь, пока идет пересчет?
Нет, не выходная таблица. Каждая строка в сислоге апдейтит данные, которые используются для расчетов. А мешают писать две причины.
1) Данные тогда все равно в ответ попадут не сразу. Только после всего пересчета. Цель у нас какая - разница во времени между приходом строки в сислоге и соответствующим изменением ответа на внешние запросы должна быть как можно меньше.
2) Не очень понятно, как тогда делать точный пересчет на основе тех данных, которые мы в тот момент и изменяем (читая сислог).

Цитата Сообщение от DrOffset Посмотреть сообщение
ct0r, кстати, существуют пропозалы подобного контейнера в новый стандарт С++.
Да, тоже видел. Внутренняя реализация там вроде на split ordered lists, как например и в TBB, PPL. Со всеми соответствующими достоинствами и недостатками.

Цитата Сообщение от DrOffset Посмотреть сообщение
Вот еще что нашлось:
Спасибо, посмотрю внимательней.

Добавлено через 14 часов 17 минут
Цитата Сообщение от ct0r Посмотреть сообщение
Спасибо, посмотрю внимательней.
К продакшену только фейсбуковская folly подходит. Жаль, что подключается она не одним файлом. Попробую и ее тоже для начала.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
18.07.2015, 16:57
Ни фига себе, "С++ для начинающих"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.07.2015, 16:57
Помогаю со студенческими работами здесь

Хэш таблица
Может кто вкратце объяснить её суть, естестно загуглил, и естестно то ли не понял, то ли не дочитал. Интересует сам принцип выборки...

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

Хэш-таблица
Ребят, помогите, пожалуйста, решить задачу: Хэш-функция определена как h(k) = k mod 11. Вводится последовательность N натуральных...

Хэш-таблица
Задание реализовать динамическую хеш-таблицу с открытой адресацией для хранения строк (операции вставки и поиска). Таблица должна...

Хэш-таблица, ошибка
Всем добрый день. Нужна помощь. За основу взять ПРИМЕР1 хэш-таблицы с прямой адресацией (разобраться с примером). Изменить функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru