|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Как сохранить данные контейнера в разделяемой памяти15.02.2017, 11:20. Показов 5612. Ответов 61
Метки нет (Все метки)
Ищу быстрый способ обмена данными между процессами. Процессы - одинакового типа т.е одна и та же программа и все процессы на одной машине.
Вроде как быстрее чем использование shared memory ничего на ум не приходит Каким образом можно хранить unordered_map в shared memory так что бы все процессы в связке имели к нему доступ на чтение и запись? Причем нужно заранее сделать reserve для бакетов хеш таблицы и эти бакеты должны быть зарезервированы в shared memory От дополнительных рекомендаций по синхронизации (кроме мьютексов) не откажусь
0
|
|
| 15.02.2017, 11:20 | |
|
Ответы с готовыми решениями:
61
Аська на основе разделяемой памяти Считать структуру из разделяемой памяти Синхронизация доступа к разделяемой памяти |
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 16.02.2017, 13:45 [ТС] | ||
Есть вещи которые из коробки не кроссплатформенные и сильно зависят от API ОС. Но по смыслу такая же штука есть и в других операционках только функции иначе называются и +/- несколько вызовов. Я бы с вами согласился еслиб АПИ для работы с шаред мемори был только у линукса.А так можно обойтись условной компиляцией все равно для реализации подобного требуется несколько строк потому все норм
0
|
||
|
Любитель чаепитий
|
|
| 16.02.2017, 13:52 | |
|
sys_beginner, Зависимость называется зависимостью, потому что она непереносима, поэтому вы не правы. Можете и дальше считать, что если у виндовс есть
CreateThreadEx, а у линукса есть pthread_create, то это значит, что они не будут называться зависимостями.
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.02.2017, 14:06 [ТС] | |
|
GbaLog-,
Ну ок, если обсуждать конкретно слово "зависимость" то частично с вами согласен. Но, одно дело когда есть зависимость которая решается несколькими строчками и только между ОС и программой, а другое дело когда кроме самой программы и ОС есть еще и третья программа, точнее махина, 98% возможностей которые просто не нужны и ухудшают производительность, тратит ресурсы. Без БД в данном случае реализация/поддержка намного проще. Поэтому то что я неправ громко сказано
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||||||||||
| 16.02.2017, 14:08 | ||||||||||||
|
Нет, реально, есть нормальные требования к производительности, а не типа "хочу, чтобы фигачило по полной, не знаю зачем, но вроде это круто говорят"? А еще (внезапно!) http://whitedb.org/ - хочешь завелосипедить?) WhiteDB is a lightweight NoSQL database library written in C, operating fully in main memory. There is no server process. Data is read and written directly from/to shared memory, no sockets are used between WhiteDB and the application program.
3
|
||||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 16.02.2017, 14:29 [ТС] | ||||||
![]() Добавлено через 6 минут ) Ты ж за него воевал
0
|
||||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|||||
| 16.02.2017, 14:44 | |||||
|
0
|
|||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 16.02.2017, 15:01 [ТС] | ||||
|
0
|
||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|||||
| 16.02.2017, 16:48 | |||||
![]() Каким образом ты их увеличишь? Сам руками? Или прогу под рутом запустишь? Или программно права будешь получать? А ты увеличишь, а внезапно какая-то другая программа их возьмет и отъест. Вот смеху-то будет. Не, так-то поиграться/написать можно что угодно и как угодно. Главное в реальном проекте сделать все нормально.
0
|
|||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 16.02.2017, 17:13 [ТС] | |||||
|
Если постоянные системные вызовы, то есть вариант кешировать значения в памяти процесса. Они все равно после создания не будут меняться. Главное что бы каждый процесс их получил после создания Добавлено через 5 минут
0
|
|||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||
| 16.02.2017, 17:38 | ||||
|
Да, кстати, еще ограничения: For portable use, a shared memory object should be identified by a name of the form /somename; that is, a null-terminated string of up to NAME_MAX (i.e., 255) characters consisting of an initial slash, followed by one or more characters, none of which are slashes. То есть так-то тебе надо хэш строки пихать как строку, если по-хорошему. И вообще, ограничение на кол-во открытых файлов не просто так появилось, если что.
1
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 16.02.2017, 17:42 [ТС] | ||||
Согласись уже ![]() Я не против другого варианта. Ищу оптимальный способ
0
|
||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 16.02.2017, 18:38 | ||
|
2) Объекты в этой области идентифицировать по их смещению от начала области. 3) Навелосипедить аллокатор который выделяет память из вышеупомянутой области. 4) Таки навелосипедить свой мап, в котором вместо указателей будут смещения, а память будет выделяться аллокатором из пункта 3. 5) Обвешать все мутексами для синхронизации доступа.
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.02.2017, 22:20 [ТС] | |
|
Renji,
Интересно. А зачем здесь нужен аллокатор? Я представляю себе это так: 1. В мапе будет зарезервирована память из шаред мемори 2. В этой памяти будут хранится списки-элементы ключ/значение и next(next element pointer) 3. Ключ и значение будут создаваться через placement new, в шаред мемори(new structname) 4. Доступ к структуре с элементом ключ-значение(pair) будет происходить по смещению в общем блоке как вы предложили Так будет работать? Добавлено через 24 минуты ... edit Добавлено через 1 час 27 минут И вот еще что интересно: откуда выделять память в том случае когда индексы будут дублироваться(коллизии)? Если блок памяти непрерывный то коллизия означает что текущее смещение в памяти уже кем-то занята. В какую область памяти в таком случае писать новый элемент с дублированным индексом (коллизией)? Добавлено через 7 минут Как грамотно можно решить этот вопрос?
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 17.02.2017, 05:11 | |||
|
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||
| 17.02.2017, 09:59 [ТС] | |||||||
Вот набросок алгоритма. Есть непрерывный блок памяти и из него выделяется память под pair-ы. Допустим нам нужно всего 2 элемента, я взял с запасом место - для 4 элементов.
Добавлено через 10 минут Свободную область можно отметить в аллокаторе и занимать её, приблизительно представляю как. Еще один map в шаред мемори. Но каким образом получать доступ к элементам за константную сложность при таком раскладе? Линейного доступа ой как не хочется, ввиду этого изначально выбор сделал в сторону unordered_map
0
|
|||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 17.02.2017, 10:09 | |||
|
Алгоритм дубовый, имени MsDOS - в начале каждого блока памяти, не важно занятого или свободного, записываете его размер и маркер "свободно/занято". Нужно выделить памяти - перебираете все блоки, пока не найдете свободный кусок достаточных размеров. Нужно освободить выделенную память - меняете маркер с "занято" на "свободно". Ну и при необходимости сливаете блок данных с его свободными соседями. Просто как три копейки, но весьма неспешно.
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 17.02.2017, 10:15 [ТС] | ||
|
Насколько я понимаю про константный доступ можно забыть? Те алгоритмы которые вы описали как я понял не дадут возможность реализовать доступ к памяти на чтение/запись за константное время
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||||
| 17.02.2017, 10:25 | ||||||||
Сообщение было отмечено Undisputed как решение
Решение
1
|
||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 17.02.2017, 10:34 [ТС] | |
|
Renji,
То есть фактически вы предлагаете сделать свой аллокатор который будет аналогом malloc только работать с шаред мемори, а дальше просто нужна реализация хеш таблицы которая будет работать с этим аллокатором. Вроде должно сработать, спасибо. При этом если будет rehash, похоже нужно будет заново большой кусок занимать а от старого избавляться А заменить просто аллокатор у unordered_map нельзя потому что он не потокобезопасен насколько я понимаю. Я все правильно понял?
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 17.02.2017, 10:48 | ||
|
1
|
||
| 17.02.2017, 10:48 | |
|
Запись и считывание разделяемой памяти Хранение указателей в разделяемой памяти Сделать массив из 10 int в разделяемой памяти В чем основное преимущество разделяемой памяти Прогон программ с использованием разделяемой памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения
Продолжаю серию постов о дискретно-событийной модели рабочего. . .
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|