Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
1

свойства map

17.05.2020, 08:58. Показов 734. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Проблема в следующем:
Имеются строковые данные, сохранённые в текстовых файлах (несколько Гб).

Для обработки данных создана структура:
C++
1
2
3
4
5
6
7
8
struct St
    {
        string Data1;
        string Data2;
        string Data3;
        ....
        string Data1000;
    };
и выделена память в виде ассоциативного массива:
C++
1
map <string, struct St> mpSt;
Все данные сразу не нужны.
Например, авторизуется пользователь на сайте, читаем в его структуру нужные данные из файла и дальше работаем с ними:
C++
1
2
3
4
5
6
7
ifstream f("Ивнов.txt")
getline (f, mpSt["Иванов"].Data1) 
getline (f, mpSt["Иванов"].Data2) 
getline (f, mpSt["Иванов"].Data3) 
.... 
getline (f, mpSt["Иванов"].Data1000)
f.close();
Выходит Иванов из акаунта - удаляем соответствующий map, чтобы освободить память:
C++
1
mpSt.erase("Иванов");
Вопрос.
Что эффективнее:
1) загрузить в map данные сразу для всех зарегистрированных пользователей и обрабатывать нужные (если не хватит оперативной памяти, то, насколько я понимаю, выделится место на жестком диске для элементов map)
2) создавать по надобности нужный map и удалять его, когда не нужен (хотя и при этом все затребованные данные могут не поместиться в оперативной памяти).
3) не использовать загрузку сразу всех элементов структуры в map, а читать из файла лишь те строки, которые будут затребованы пользователем, при этом, чтобы прочитать 1000-ю строку, я должен вхолостую "прочитать" 999 строк. ("дёргать" жесткий диск для временного хранения и обработки данных в отдельных элементах структуры).

Подозреваю, что 2-й ответ правильный. Но не уверен. Поэтому и спрашиваю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2020, 08:58
Ответы с готовыми решениями:

Поместить вектора в map и реализовать перегрузку вывода для map
Всем привет! Нужна помощь в написании программы. У меня есть вот такая прога и мне нужно каким-то...

Обращение к элементам vector, который находится в map, находящийся в map
Всем добрый день! Имеется такой контейнер. Как обращаться к элементам вектора и как пушбэчить...

Обращение к map, который внутри другого map
std::map&lt;int, std::map&lt;std::string, int&gt;&gt; m1; std::map&lt;std::string, int&gt; m2; void main() {...

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы...

15
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
17.05.2020, 09:32 2
Цитата Сообщение от LVV Посмотреть сообщение
string Data1;
        string Data2;
        string Data3;
в структуре 1000 полей string? может лучше один массив на 1000 элементов?
1
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
17.05.2020, 09:45  [ТС] 3
_stanislav, мне нужно к каждому полю обращаться по имени.
У пользователя есть, логин, почта, пароль, дата регистрации, рейтинг, и т.д. и т.п. И ко всем этим полям в нужное время по имени поля нужно иметь доступ (а не по индексам).
C++
1
2
3
4
5
6
7
8
struct St
    {
        string Name;
        string Email;
        string Password;
        ....
        string Adress;
    };
Ну, наверное, можно и по индексам....
Только боюсь запутаться, придётся таблицы соответствий создавать.

индекс 0 - хранит имя
индекс 1 - хранит почту
и т.д....

Хотя, наверное, поэффективнее будет работать с массивом, чем со структурой... Не знаю.
А Вы как считаете?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
17.05.2020, 10:01 4
Цитата Сообщение от LVV Посмотреть сообщение
Хотя, наверное, поэффективнее будет работать с массивом, чем со структурой... Не знаю.
А Вы как считаете?
Оставь структуру. Понятно, что с тысячей ты там погорячился

Добавлено через 2 минуты
Цитата Сообщение от LVV Посмотреть сообщение
Вопрос.
Что эффективнее:
Для начала - эффективнее будет
C++
1
2
3
4
5
6
7
8
9
10
ifstream f("Ивнов.txt")
St obj;
getline(f, obj.Data1)
getline(f, obj.Data2)
getline(f, obj.Data3)
....
getline(f, obj.Data1000)
 
mpSt.emplace({ "Иванов", std::move(obj) });
f.close();
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
Цитата Сообщение от LVV Посмотреть сообщение
Подозреваю, что 2-й ответ правильный. Но не уверен. Поэтому и спрашиваю.
Цитата Сообщение от LVV Посмотреть сообщение
Например, авторизуется пользователь на сайте, читаем в его структуру нужные данные из файла и дальше работаем с ними:
Начитай в std::map (или в std::vector и потом отсортируй) не всю структуру, а только ключ и смещение в файле - std::map<std::string, size_t> и при обращении начитывай данные из файла по этому смещению
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
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
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Начитай в std::map (или в std::vector и потом отсортируй) не всю структуру, а только ключ и смещение в файле - std::map<std::string, size_t> и при обращении начитывай данные из файла по этому смещению
Хранить в структуре не значения полей (строки), а только смещения (числовые значения вместо строк)?
И читать по мере надобности данные из бинарного файла в строковые переменные с нужного места?
Правильно я понял?
А жесткий диск не накроется при одновременной авторизации на сайте сотни пользовтелей?


Цитата Сообщение от IGPIGP Посмотреть сообщение
Может БД заюзать?
Если бы разбирался, "заюзал" бы.
А чем файловая структура Windows - не база данных?
Храни данные в папках и файлах, читай, обрабатывай...
(если профанский вопрос, то извините)
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
17.05.2020, 10:33 9
Цитата Сообщение от LVV Посмотреть сообщение
И читать по мере надобности данные из бинарный файла в строковые переменные с нужного места?
Правильно я понял?
Не бинарные, обычные текстовые, также как ты и сейчас начитываешь. Только перед чтением делаешь seekg
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.05.2020, 10:57 10
Цитата Сообщение от LVV Посмотреть сообщение
Если бы разбирался, "заюзал" бы.
LVV, это по другому работает. Сначала приходит задача, а потом скил её решать. Доки читать, разбирать, это и есть работа) Задачу то вы ставите - не учебную.
1
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
17.05.2020, 11:35  [ТС] 11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Доки читать, разбирать, это и есть работа
Может посоветуете самый оптимальный способ (ссылки, литературу) без травмирования психики вникнуть в использование БД в консольных приложениях С++.

Добавлено через 31 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
максимальный размер мапы
Я посмотрел (Visual Studio 2017) максимальный размер своего map-контейнера (насколько я понимаю - это максимальное количество элементов в нём)
http://www.cplusplus.com/refer... /max_size/
и у меня выдало невероятно большое число: 33 909 456 017 848 440
C++
1
cout << mpSt.max_size() << endl;
Что оно на самом деле означает?
Если каждый элемент в таком map-контейнере будет весить всего 1 бит, то максимальный объём занимаемой памяти составит 4238 ТераБайт
Что не так в моих рассуждениях?
Как определить не количество объектов в map, а максимальный обьём памяти?
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.05.2020, 11:37 12
Цитата Сообщение от LVV Посмотреть сообщение
Может посоветуете самый оптимальный способ (ссылки, литературу) без травмирования психики
Там нет ни чего быстрого. Нужно почитать и самому определить объем вышей задачи, среду выполнения, и выбрать базу. Потом учить интерфейс. Очереди запросов, язык SQL... Любое руководство требует внимания. Главное на ногу не уронить. По себе знаю. А будет ли это mysql или msaccess или ещё что, - выяснится позже. А почему настольное приложение? Я думал вы базу на сайте прикрутить хотите.

Добавлено через 2 минуты
Цитата Сообщение от LVV Посмотреть сообщение
Что оно на самом деле означает?
Оно означает что даже если ключ и значения - типы char (2 байта на двоих хватит), то и в этом случае ваша мапа ограничена данным количеством элементов в текущей реализации.
1
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
17.05.2020, 11:44  [ТС] 13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я думал вы базу на сайте прикрутить хотите.
Именно на сайте.
Только на собственном.
Сделал в консольном приложении С++ сервер.
Всё работает как надо с примитивной базой данных на Windows-папках и текстовых файлах.
Десяток-два клиентов одновременно держит без проблем.
(тестирует задачи решенные на С++ и отправленные для проверки пользователем)
Озадачился вопросом: а сколько клиентов одновременно выдержит такой сервер не подвиснув?
Вот и выясняю.
(я, можно сказать дилетант-самоучка в этом вопросе)

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Оно означает что даже если ключ и значения - типы char (2 байта на двоих хватит), то и в этом случае ваша мапа ограничена данным количеством элементов в текущей реализации.
Не понял.
Так какой максимальный обьём памяти допустим в моей мапе, при 33 909 456 017 848 440 обьектах в ней?
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.05.2020, 11:54 14
Цитата Сообщение от LVV Посмотреть сообщение
Так какой максимальный обьём памяти допустим в моей мапе, при 33 909 456 017 848 440 обьектах в ней?
Контейнеры по умолчанию в куче выделяют. Для размышления посмотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 map<char, char>mapa;
        map<int, int>mapi;
        map<double, double>mapd;
        map<string, int[100]>map_ass;
 
   cout
   <<"mapa "<<mapa.max_size()
   <<"\nmapi "<<mapi.max_size()
   <<"\nmapd "<<mapd.max_size()
   <<"\nmap_ass "<<map_ass.max_size()<<endl
   ;
   cin.get();


Добавлено через 4 минуты
Цитата Сообщение от LVV Посмотреть сообщение
Озадачился вопросом: а сколько клиентов одновременно выдержит такой сервер не подвиснув?
Это вопрос космический. Ему посвящены сонеты, элегии, жертвы убиенных во цвете сил бутербродов...
LVV, стандартное решение нужно применить. Стать разработчиком баз данных, экспертом по безопасности, компиляторщиком - не вопрос. Время и желание, - тоже не вопрос. Вопрос в их количестве.
1
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
17.05.2020, 12:19  [ТС] 15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Для размышления посмотрите
Посмотрел.
Вопросы остались те же.
У меня мапа содержит структуру.
А структура в свою очередь содержит несколько мап и мультимап.
И у меня max_size выдаёт 17-значные числа.
Я понимаю, что объектов в моих мапах может быть много, но каков максимальный обьём памяти мой мап может занимать?
Ладно. Извините за навязчивость. Спасибо.
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.05.2020, 12:53 16
Цитата Сообщение от LVV Посмотреть сообщение
Посмотрел.
То есть, поняли, что размер в штуках - тёмное дело)
Цитата Сообщение от LVV Посмотреть сообщение
Я понимаю, что объектов в моих мапах может быть много, но каков максимальный обьём памяти мой мап может занимать?
А вот это и есть суть. Может закончиться память. Но базы уже владеют технологиями оптимизации и сжатия текстовой информации. То есть, для вашей задачи ответ очевиден. Вы же не ставите задачу, хочу написать бэк-энд библиотеку для ... У вас фронт-энд задача. С другой стороны, этот же вопрос:
Цитата Сообщение от LVV Посмотреть сообщение
Я понимаю, что объектов в моих мапах может быть много, но каков максимальный обьём памяти мой мап может занимать?
Это патетика. Даже если не кто не соберётся вас перегрузить/поломать нет гарантии что юзеры с именами "Qleskrlkghnmdsfhhfglvb" не станут ярыми любителями вашего продукта.
Я уже не говорю о том, кто разрешит вам запустить С++ на своём сервере. Я ковырял на скриптовых всё что нужно. ПХП - например.
Цитата Сообщение от LVV Посмотреть сообщение
Ладно. Извините за навязчивость. Спасибо.
Не за что. С вами общаться легко и приятно, так что "навязчивость", это преувеличение. Дань скромности, - понимаю. Всё нормально LVV, эта тема, наверняка может интересовать многих людей и возможно, ещё будет иметь продолжение. Я не стану в ней центральной фигурой в этом случае, а сам с удовольствием почитаю реальных спецов)
0
17.05.2020, 12:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2020, 12:53
Помогаю со студенческими работами здесь

Как вставить элемент и вывести элементы на экран в map<string, map<string,int>> ?
У меня есть map&lt;string, map&lt;string,int&gt;&gt;, в него надо добавить элементы (типа Ivanov potato 200)...

Как вставить map в map
есть такой map map &lt; INT64 , map &lt;INT64 , map&lt; wArray , int &gt; &gt; &gt; tMenu; как его заполнить?...

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa;...

Очистка map и перевернутого std::map c std::greater
Написала я программу, которая заполняет два контейнера map. a,b. вывод программы такой 11 a:...

Приведение map<int, B> к map<int, A>
class A {}; class B : public A {}; unordered_map&lt;int, shared_ptr&lt;B&gt; &gt; bs; Как привести bs к...

Запись значения в map<string, map<string,string>>
Как корректно записать значение в map&lt;string, map&lt;string,string&gt;&gt;? Добавлено через 27 минут...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru