155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
свойства map17.05.2020, 08:58. Показов 734. Ответов 15
Метки нет (Все метки)
Здравствуйте.
Проблема в следующем: Имеются строковые данные, сохранённые в текстовых файлах (несколько Гб). Для обработки данных создана структура:
Например, авторизуется пользователь на сайте, читаем в его структуру нужные данные из файла и дальше работаем с ними:
Что эффективнее: 1) загрузить в map данные сразу для всех зарегистрированных пользователей и обрабатывать нужные (если не хватит оперативной памяти, то, насколько я понимаю, выделится место на жестком диске для элементов map) 2) создавать по надобности нужный map и удалять его, когда не нужен (хотя и при этом все затребованные данные могут не поместиться в оперативной памяти). 3) не использовать загрузку сразу всех элементов структуры в map, а читать из файла лишь те строки, которые будут затребованы пользователем, при этом, чтобы прочитать 1000-ю строку, я должен вхолостую "прочитать" 999 строк. ("дёргать" жесткий диск для временного хранения и обработки данных в отдельных элементах структуры). Подозреваю, что 2-й ответ правильный. Но не уверен. Поэтому и спрашиваю.
0
|
17.05.2020, 08:58 | |
Ответы с готовыми решениями:
15
Поместить вектора в map и реализовать перегрузку вывода для map Обращение к элементам vector, который находится в map, находящийся в map Обращение к map, который внутри другого map Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? |
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||
17.05.2020, 09:45 [ТС] | 3 | |||||
_stanislav, мне нужно к каждому полю обращаться по имени.
У пользователя есть, логин, почта, пароль, дата регистрации, рейтинг, и т.д. и т.п. И ко всем этим полям в нужное время по имени поля нужно иметь доступ (а не по индексам).
Только боюсь запутаться, придётся таблицы соответствий создавать. индекс 0 - хранит имя индекс 1 - хранит почту и т.д.... Хотя, наверное, поэффективнее будет работать с массивом, чем со структурой... Не знаю. А Вы как считаете?
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||
17.05.2020, 10:01 | 4 | |||||
Оставь структуру. Понятно, что с тысячей ты там погорячился
Добавлено через 2 минуты Для начала - эффективнее будет
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
17.05.2020, 10:06 [ТС] | 5 |
Спасибо, oleg-m1973, не знал.
Буду вникать.
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
17.05.2020, 10:08 | 6 |
Начитай в std::map (или в std::vector и потом отсортируй) не всю структуру, а только ключ и смещение в файле - std::map<std::string, size_t> и при обращении начитывай данные из файла по этому смещению
1
|
Комп_Оратор)
|
|
17.05.2020, 10:19 | 7 |
LVV, максимальный размер мапы
http://www.cplusplus.com/refer... /max_size/ то есть, для списка и карты примерно одинаково: https://ru.cppreference.com/w/... t/max_size Максимальный размер действительно существует. При этом оговаривается, что контейнер может упасть раньше достижения этой (зависящей от реализайии но обычно size_type::max, величины) в случае если произойдёт срыв выделения памяти. Последнее намекает о том, что среда выполнения С++ не будет сериализовать map на диск. Это я думаю потому, что map по своей природе - дерево (самоупорядочиваемая по размещению в памяти структура) и трансформация её в последовательность а потом восстановление очень дороги по времени. А это похоже - ваш случай. Тут нужны разделяемые строки с подсчётом ссылок, сжатие или возможно даже хеширование. Иначе структуры с их размерами станут главной проблемой. А недостаточность памяти трудно решить созданием какой нибцдь map<map<string>> обёрнутой классом отслеживающим диапазоны первых слов ключей, например. Может БД заюзать?
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
17.05.2020, 10:30 [ТС] | 8 |
Хранить в структуре не значения полей (строки), а только смещения (числовые значения вместо строк)?
И читать по мере надобности данные из бинарного файла в строковые переменные с нужного места? Правильно я понял? А жесткий диск не накроется при одновременной авторизации на сайте сотни пользовтелей? Если бы разбирался, "заюзал" бы. А чем файловая структура Windows - не база данных? Храни данные в папках и файлах, читай, обрабатывай... (если профанский вопрос, то извините)
0
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||
17.05.2020, 11:35 [ТС] | 11 | |||||
Может посоветуете самый оптимальный способ (ссылки, литературу) без травмирования психики вникнуть в использование БД в консольных приложениях С++.
Добавлено через 31 минуту Я посмотрел (Visual Studio 2017) максимальный размер своего map-контейнера (насколько я понимаю - это максимальное количество элементов в нём) http://www.cplusplus.com/refer... /max_size/ и у меня выдало невероятно большое число: 33 909 456 017 848 440
Если каждый элемент в таком map-контейнере будет весить всего 1 бит, то максимальный объём занимаемой памяти составит 4238 ТераБайт Что не так в моих рассуждениях? Как определить не количество объектов в map, а максимальный обьём памяти?
0
|
Комп_Оратор)
|
|
17.05.2020, 11:37 | 12 |
Там нет ни чего быстрого. Нужно почитать и самому определить объем вышей задачи, среду выполнения, и выбрать базу. Потом учить интерфейс. Очереди запросов, язык SQL... Любое руководство требует внимания. Главное на ногу не уронить. По себе знаю. А будет ли это mysql или msaccess или ещё что, - выяснится позже. А почему настольное приложение? Я думал вы базу на сайте прикрутить хотите.
Добавлено через 2 минуты Оно означает что даже если ключ и значения - типы char (2 байта на двоих хватит), то и в этом случае ваша мапа ограничена данным количеством элементов в текущей реализации.
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
17.05.2020, 11:44 [ТС] | 13 |
Именно на сайте.
Только на собственном. Сделал в консольном приложении С++ сервер. Всё работает как надо с примитивной базой данных на Windows-папках и текстовых файлах. Десяток-два клиентов одновременно держит без проблем. (тестирует задачи решенные на С++ и отправленные для проверки пользователем) Озадачился вопросом: а сколько клиентов одновременно выдержит такой сервер не подвиснув? Вот и выясняю. (я, можно сказать дилетант-самоучка в этом вопросе) Добавлено через 2 минуты Не понял. Так какой максимальный обьём памяти допустим в моей мапе, при 33 909 456 017 848 440 обьектах в ней?
0
|
Комп_Оратор)
|
||||||
17.05.2020, 11:54 | 14 | |||||
Контейнеры по умолчанию в куче выделяют. Для размышления посмотрите:
Добавлено через 4 минуты Это вопрос космический. Ему посвящены сонеты, элегии, жертвы убиенных во цвете сил бутербродов... LVV, стандартное решение нужно применить. Стать разработчиком баз данных, экспертом по безопасности, компиляторщиком - не вопрос. Время и желание, - тоже не вопрос. Вопрос в их количестве.
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
17.05.2020, 12:19 [ТС] | 15 |
Посмотрел.
Вопросы остались те же. У меня мапа содержит структуру. А структура в свою очередь содержит несколько мап и мультимап. И у меня max_size выдаёт 17-значные числа. Я понимаю, что объектов в моих мапах может быть много, но каков максимальный обьём памяти мой мап может занимать? Ладно. Извините за навязчивость. Спасибо.
0
|
Комп_Оратор)
|
|
17.05.2020, 12:53 | 16 |
То есть, поняли, что размер в штуках - тёмное дело)
А вот это и есть суть. Может закончиться память. Но базы уже владеют технологиями оптимизации и сжатия текстовой информации. То есть, для вашей задачи ответ очевиден. Вы же не ставите задачу, хочу написать бэк-энд библиотеку для ... У вас фронт-энд задача. С другой стороны, этот же вопрос: Это патетика. Даже если не кто не соберётся вас перегрузить/поломать нет гарантии что юзеры с именами "Qleskrlkghnmdsfhhfglvb" не станут ярыми любителями вашего продукта. Я уже не говорю о том, кто разрешит вам запустить С++ на своём сервере. Я ковырял на скриптовых всё что нужно. ПХП - например. Не за что. С вами общаться легко и приятно, так что "навязчивость", это преувеличение. Дань скромности, - понимаю. Всё нормально LVV, эта тема, наверняка может интересовать многих людей и возможно, ещё будет иметь продолжение. Я не стану в ней центральной фигурой в этом случае, а сам с удовольствием почитаю реальных спецов)
0
|
17.05.2020, 12:53 | |
17.05.2020, 12:53 | |
Помогаю со студенческими работами здесь
16
Как вставить элемент и вывести элементы на экран в map<string, map<string,int>> ? Как вставить map в map Emplace в std::map. Как добавить элемент в std::map без копирования? Очистка map и перевернутого std::map c std::greater Приведение map<int, B> к map<int, A> Запись значения в map<string, map<string,string>> Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |