Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631

Поиск по большой таблице в памяти

10.09.2018, 19:33. Показов 1161. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, проконсультируйте плиииз!

Код сейчас НЕ нужен! Нужно "понимание темы" и "чтобы почитать"... (помогут ЛЮБЫЕ советы)
(кодить начну минимум через 2-3 месяца, когда будет сама таблица, а пока "подготовка инструмента")

Задача:
1) ОЧЕНЬ большая таблица в памяти. Сотни тысяч или миллионы записей вида строка(до 20 символов)-число (длинное целое). Строки могут повторяться, числа тоже, но "пары" строка-число - уникальны.
2) Функция МАКСИМАЛЬНО быстрого поиска 10 первых чисел по полной строке. Подозреваю что нужно строить индекс (btree? немного знаком из Posgtgres)
3) Записать/восстановить таблицу (и индексы?) на диск.
Таблица "статическая" (создается и не меняется, после создания скидывается на диск, а после этого только читается)

Есть для подобного ГОТОВЫЕ механизмы в С++?
Или что бы почитать?
Собирать буду под Линукс (хостинг), поэтому "готовые библиотеки от Windows" не помогут.

По сути нужен механизм аналогичный базам Redis, но заточенный под одну задачу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2018, 19:33
Ответы с готовыми решениями:

Быстрый поиск максимума и минимума в диапазоне данных в большой таблице
Есть большая таблица (> 10млн. записей). Первичный ключ таблицы это дата и время события. Мне нужно сделать очень быстрый поиск максимума...

Поиск в большой таблице SQL 2000 выдает Timeout. Что надо сделать ?
День добрый ! На SQL Server-e 2000 есть большая табл. Пытаюсь из asp сделать по ней поиск. При нажатии на кнопку в форме думает сек. 30,...

Добавление колонки в большой таблице
в таблице свыше 30млн записей и я хочу добавить один столбец численный , пишу в пхп админ запрос alter table `table` add p INT(1) NOT...

9
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
10.09.2018, 20:28
Я знаю только префиксное дерево
1
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
10.09.2018, 21:29
Цитата Сообщение от andyj Посмотреть сообщение
Есть для подобного ГОТОВЫЕ механизмы в С++?
Есть. Там вся ваша программа займёт порядка 20-30 строк кода вместе со чтением/записью. Вы слишком преувеличиваете сложность проблемы.
Цитата Сообщение от andyj Посмотреть сообщение
поэтому "готовые библиотеки от Windows" не помогут
В С++ стандартные библиотеки кроссплатформленные.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.09.2018, 21:40
Цитата Сообщение от andyj Посмотреть сообщение
1) ОЧЕНЬ большая таблица в памяти. Сотни тысяч или миллионы записей вида строка(до 20 символов)-число (длинное целое). Строки могут повторяться, числа тоже, но "пары" строка-число - уникальны.
Вы украли из музея компьютер с 128 мегабайтами памяти на борту? Если нет, то миллионы записей аж по двадцать символов каждая это не "ОЧЕНЬ большая". Работающий Файрфокс небось больше сожрет.
Цитата Сообщение от andyj Посмотреть сообщение
2) Функция МАКСИМАЛЬНО быстрого поиска 10 первых чисел по полной строке. Подозреваю что нужно строить индекс (btree? немного знаком из Posgtgres)
std::map по строкам, внутри std::set по числам. Нет, это не "МАКСИМАЛЬНО" быстро, можно еще аллокаторы потамагочить и с хеш-таблицами поиграться. Только заниматься этим надо после полевых испытаний показавших что скорости маловато будет.
1
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
10.09.2018, 22:23  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
std::map по строкам, внутри std::set по числам. Нет, это не "МАКСИМАЛЬНО" быстро, можно еще аллокаторы потамагочить и с хеш-таблицами поиграться. Только заниматься этим надо после полевых испытаний показавших что скорости маловато будет.
Пока хватит! СПАСИБО! Начну вычитывать... "Аллокаторы памяти" скорее всего нужны (если я правильно понял что это) - хочу "одним блоком" читать базу из файла в память и "считать ее заготовкой map+set".

Поясните только если можно:
1) std::map - это полноценная "индексированая" не ограниченная таблица в памяти для ускоренного поиска по названию? где быстрее всего идет ПОИСК записи (а не добавление/изменение)?
2) можно ЕЩЕ ускорить поиск в подобной таблице добавив многопоточность? Или создав по ::map в каждом потоке?

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Вы украли из музея компьютер с 128 мегабайтами памяти на борту? Если нет, то миллионы записей аж по двадцать символов каждая это не "ОЧЕНЬ большая". Работающий Файрфокс небось больше сожрет.
Я из Node.js! :( Там попытка создать В ПАМЯТИ таблицу на миллион значений с индексами = однозначное зависание без пояснения причин... и "сбросить на диск"/"восстановить с диска" таблицу не реально без перебора КАЖДОЙ записи (в цикле)...

Хочу плагин для Ноды написать на С++. Недавно нашел кучу примеров, но еще с методами вызова из Ноде разбираться.
Пока "набираю" таблицу в Postgres. Запрос на 600 записей без индекса = 100-150мс. = меньше 100 запросов в секунду для хостинга (не основная задача). Хочу уменьшить до 3-10мс.

0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.09.2018, 23:09
Цитата Сообщение от andyj Посмотреть сообщение
1) std::map - это полноценная "индексированая" не ограниченная таблица в памяти для ускоренного поиска по названию? где быстрее всего идет ПОИСК записи (а не добавление/изменение)?
Да, полноценная таблица для поиска. По названию или по числам ей в общем-то все равно, главное функцию сравнения ключей дайте (для std::string сама подцепит). Если нужно именно быстрый поиск, ценой всего остального:
1) std::unordered_map. Скорость поиска в большинстве случаев вне конкуренции. Там хэш-функция, она с равным успехом переварит и миллион ключей, и миллиард. Но есть небольшой шанс что таки подавится. Правда, любители хэш-таблиц поговаривают что вероятность падения метеорита выше.
2) Свалить все записи в массив, один раз отсортировать его std::sort и потом кататься по нему std::lower_bound. Быстрый и простой поиск, очень удобно выгружать таблицу в файл и выгружать обратно. Но любая попытка исправления потребует нового вызова std::sort, а он дорогой.
Цитата Сообщение от andyj Посмотреть сообщение
2) можно ЕЩЕ ускорить поиск в подобной таблице добавив многопоточность? Или создав по ::map в каждом потоке?
Поиск имеет логарифмическую сложность, то есть в вашем случае делает сравнений двадцать. У вас поток будет дольше создаваться, чем эти несчастные двадцать сравнений выполняться. Основные накладные расходы здесь скорее придутся на стадию заполнения таблицы - постоянно дергается динамическая память, а ее быстрой работы никто не обещал. Тут как раз и нужны наколеночные аллокаторы.
Цитата Сообщение от andyj Посмотреть сообщение
Я из Node.js! Там попытка создать В ПАМЯТИ таблицу на миллион значений с индексами = однозначное зависание без пояснения причин... и "сбросить на диск"/"восстановить с диска" таблицу не реально без перебора КАЖДОЙ записи (в цикле)...
Запускаем, проверяем сколько времени таблицу строит. Ну, не мгновенно конечно, но за пару секунд с работой справляется. И это построение таблицы, а не поиск в ней.
1
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
10.09.2018, 23:29
Цитата Сообщение от andyj Посмотреть сообщение
Таблица "статическая" (создается и не меняется, после создания скидывается на диск, а после этого только читается)
Почему базы данных не использовать?
0
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
10.09.2018, 23:56  [ТС]
Цитата Сообщение от JaponDemon Посмотреть сообщение
Почему базы данных не использовать?
потому что это будет то-же самое, но не в памяти и без оптимизации. Постгрес меня в этом вопросе подвел (по скорости поиска)
У меня данные "статические" - один раз заполнил, сохранил и больше не меняю.

Думал на Редис, но это для ноды
1) отдельная программа работающая через TCP/IP (а не встроенный плагин) = лишняя потеря времени. Если можно этого избежать небольшими усилиями...
2) умеющая искать по части слова(там "ключи"), а значит не так сильно оптимизирована. Как и механизмы "добавления" наверняка понижают скорость "чтения/поиска".
3) у меня он уже используется, и не уверен насколько тяжело там "разделить" данные по нескольким задачам в одном проекте.

Добавлено через 15 минут
Как я уже писал выше, база у меня УЖЕ есть. Она полупустая и 2-4 месяца будет ее заполнение (полу-автоматическое). И я на 80-90% уверен что она начнет сильно тормозить (уже на 800 записях получил лимит в 100 запросов в секунду, а планируется минимум 50тыс). Поэтому решил сделать "внешний индекс" - поиск по моей таблице (по ЛЮБОЙ части слова), а детальные данные уже по ключам(id) полученным из заранее сформированного кеш-мапа. После окончательного заполнения базы, новые записи будут ОЧЕНЬ редко добавляться (10-20 в месяц) и можно будет в "полуручном" режиме дополнять таблицу или в "автоматическом" (запустив "формирование нового мапа" хоть на всю ночь)

...вопрос ЗДЕСЬ задал чтобы иметь представление куда двигаться в разработке/оптимизации когда/ЕСЛИ база начнет тормозить (реально мешая работе).


Пока не могу найти "полу-готового" решения для сброса ::map в БИНАРНЫЙ файл и чтения файла в память сразу как ::map. Только "построчная запись". Не подскажите, такое решение Вам встречалось? (например в связке с аллокаторами)
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.09.2018, 01:03
Цитата Сообщение от andyj Посмотреть сообщение
Пока не могу найти "полу-готового" решения для сброса ::map в БИНАРНЫЙ файл и чтения файла в память сразу как ::map.
Там красно-черное дерево. Так что чтобы загружать map сильно быстрее "построчного варианта", вам нужно скинуть в файл структуру этого дерева. А map доступа к этой структуре не предусматривает. Хотя в принципе никто не мешает вам поковыряться в исходниках какого ни будь AVLMap и попытаться добавить нужный функционал самостоятельно.

Впрочем, есть и лайт-вариант - добавлять записи по одной, но строго в порядке возрастания ключа, через метод insert и выставив hint в myMap.end(). Теоретически это должно ускорить загрузку.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.09.2018, 01:11
delete
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2018, 01:11
Помогаю со студенческими работами здесь

Вычисление повторов в большой таблице
Добрый день. Есть база MySQL, в ней 2 таблицы: таблица папок и файлов. В таблице файлов ~1,300 ккк строк. Поля: file_id, file_csum,...

Большой расход памяти
Пишу приложение, которое берёт слово из файла и отправляет его через форму на сайт. И всё работает как надо, вот только потребляемая память...

Быстрый и точный подсчёт количества строк в большой таблице
Добрый день, может кто подскажет такую вещь написал клиент для работы с бд и нужно при старте показывать количество записей в таблице. ...

Поиск по части наименования в таблице и перевод курсора в соответствующую область в другой таблице
Добрый день. Есть файл, в нем на листе Label_base вызывается по кнопке форма. Далее задуман такой алгоритм: - юзер вводит в...

Выделение большой памяти и крах C++)
Приветствую. Может кто встречался с данным недорозумением. Требуется выделить прилично памяти что то около 12*218*368 байт ...Выделю...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru