Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
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
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2017, 11:20
Ответы с готовыми решениями:

Аська на основе разделяемой памяти
Прогреры и хакеры и им подобные... обращаюсь с особой просьбой: есть мысли по поводу перессылки сообщений через разделяемую память между...

Считать структуру из разделяемой памяти
Добрый день! Есть разделяемый файл. В приложении А в файл запихиваю структуру. В приложении Б считываю эту структуру из файла. Выдается...

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

61
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
16.02.2017, 13:45  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
Это уже зависимость от операционки.
Ну извините Есть вещи которые из коробки не кроссплатформенные и сильно зависят от API ОС. Но по смыслу такая же штука есть и в других операционках только функции иначе называются и +/- несколько вызовов. Я бы с вами согласился еслиб АПИ для работы с шаред мемори был только у линукса.
А так можно обойтись условной компиляцией все равно для реализации подобного требуется несколько строк потому все норм
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
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
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
16.02.2017, 14:08
Цитата Сообщение от sys_beginner Посмотреть сообщение
Установка БД
Ок, поставить парочку пакетов - ну 1 минута.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Это займет доп. место на диске, а её код в памяти
Цитата Сообщение от sys_beginner Посмотреть сообщение
Дополнительная трата памяти и процессорного времени на работу адаптера БД
Цитата Сообщение от sys_beginner Посмотреть сообщение
- Падение в kernel space из за использования системных вызовов на каждое чтение/запись
А еще счет за электричество вырастет огого! Именно это я и упустил!)
Нет, реально, есть нормальные требования к производительности, а не типа "хочу, чтобы фигачило по полной, не знаю зачем, но вроде это круто говорят"?

Цитата Сообщение от sys_beginner Посмотреть сообщение
Установка адаптера для работы с БД на плюсах (и не факт что он не кривой ибо не стандартный)
5 минут, чтобы подключить либу драйвера. С/С++ официально поддерживаются почти всегда.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Хранение копии данных на диске для обеспечения персистентности (которая мне в этом случае не нужна)
Aerospike, Coherence, memcached, Redis - все RAM.
А еще (внезапно!) 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.

Цитата Сообщение от sys_beginner Посмотреть сообщение
- Скорость будет слабее, т.к работать будут две программы
У тебя в системе их не один десяток одновременно работает (сюрприз!).

Цитата Сообщение от sys_beginner Посмотреть сообщение
- Ядра процессора будут более загружены, т.к БД может создавать один или более потоков для своей работы
Потоки, которые что-то делают, нужны. А потоки, которые не делают ничего, систему не грузят вообще никак.

Цитата Сообщение от sys_beginner Посмотреть сообщение
- Зависимость от стороннего ПО
По факту - единственное, что нужно рассматривать, это стоит ли увеличивать технологический стэк ради профита, который будет получен. Это зависит от конкретной ситуации. В твоей - может и не нужно, я без понятия, что там у тебя. Но все "минусы", что были выше - ни о чем.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Если подумать еще, можно нарыть побольше минусов...
Ну попробуй))

Цитата Сообщение от sys_beginner Посмотреть сообщение
В случае с shm_*:
- Получить id объекта в памяти
- Считать/записать новое значение
shm_open с идентификатором, используемым как key, - это трындец!)) Если конечно ключей там не как в студенческой лабе.
3
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
16.02.2017, 14:29  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
У тебя в системе их не один десяток одновременно работает (сюрприз!).
Тем более лишнего не нужно

Цитата Сообщение от ct0r Посмотреть сообщение
Потоки, которые что-то делают, нужны. А потоки, которые не делают ничего, систему не грузят вообще никак.
Так зачем выделять два потока на то что можно сделать в одном потоке если конечная цель не распаралелить какую то сложную задачу? Особенно тогда когда код все равно должен быть выполнен последовательно

Цитата Сообщение от ct0r Посмотреть сообщение
Но все "минусы", что были выше - ни о чем.
Пусть каждый останется при своем мнении, но я наглядно расписал где больше телодвижений и проблем а где нет

Цитата Сообщение от ct0r Посмотреть сообщение
shm_open с идентификатором, используемым как key, - это трындец!)) Если конечно ключей там не как в студенческой лабе.
Всмысле? Про ключи знает программа и все процессы, никаких проблем не вижу

Добавлено через 6 минут
Цитата Сообщение от ct0r Посмотреть сообщение
Data is read and written directly from/to shared memory, no sockets are used between WhiteDB and the application program.
А как же IPC на удаленных нодах? ) Ты ж за него воевал
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
16.02.2017, 14:44
Цитата Сообщение от sys_beginner Посмотреть сообщение
Так зачем выделять два потока на то что можно сделать в одном потоке если конечная цель не распаралелить какую то сложную задачу? Особенно тогда когда код все равно должен быть выполнен последовательно
??? У меня для тебя плохие новости: у тебя в любом случае будет поток, который управляет хранилищем.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Пусть каждый останется при своем мнении, но я наглядно расписал где больше телодвижений и проблем а где нет
Мнение мнением, но ты просто объективно чушь написал.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Всмысле? Про ключи знает программа и все процессы, никаких проблем не вижу
За исключением тормозов и того, что у каждого процесса и системы в целом есть ограничение на кол-во открытых файловых дескрипторов.

Цитата Сообщение от sys_beginner Посмотреть сообщение
А как же IPC на удаленных нодах?
Приспосабливаюсь. Предлагаю различные варианты.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
16.02.2017, 15:01  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
У меня для тебя плохие новости: у тебя в любом случае будет поток, который управляет хранилищем.
Если даже так, все равно без базы как минимум на 1 поток меньше.
Цитата Сообщение от ct0r Посмотреть сообщение
Мнение мнением, но ты просто объективно чушь написал.
Ага, конечно. Все эта возня же проще и быстрее чем пара вызовов shm_* ...
Цитата Сообщение от ct0r Посмотреть сообщение
За исключением тормозов и того, что у каждого процесса и системы в целом есть ограничение на кол-во открытых файловых дескрипторов.
Про тормоза не понял... Дескрипторов будет не много и их можно увеличить
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
16.02.2017, 16:48
Цитата Сообщение от sys_beginner Посмотреть сообщение
Если даже так, все равно без базы как минимум на 1 поток меньше.
+100 опыта к способности "Скупость". Поздравляем, вы теперь Эконом 80 уровня!

Цитата Сообщение от sys_beginner Посмотреть сообщение
Все эта возня же проще и быстрее чем пара вызовов shm_* ...
Так что ты там сделал со вчерашнего утра? Уже написал пару строк shm_* (1 минута)? Работает?

Цитата Сообщение от sys_beginner Посмотреть сообщение
Про тормоза не понял...
Так системный вызов же! Ведь весь смысл-то в том, что мы один раз его делаем, а потом бегаем по памяти как хотим на халяву. А ты теперь сам предлагаешь его на каждое значение делать?

Цитата Сообщение от sys_beginner Посмотреть сообщение
Дескрипторов будет не много и их можно увеличить
Если их будет немного, зачем тебе вообще чтобы было быстро?
Каким образом ты их увеличишь? Сам руками? Или прогу под рутом запустишь? Или программно права будешь получать?
А ты увеличишь, а внезапно какая-то другая программа их возьмет и отъест. Вот смеху-то будет.

Не, так-то поиграться/написать можно что угодно и как угодно. Главное в реальном проекте сделать все нормально.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
16.02.2017, 17:13  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
Так системный вызов же! Ведь весь смысл-то в том, что мы один раз его делаем, а потом бегаем по памяти как хотим на халяву. А ты теперь сам предлагаешь его на каждое значение делать?
Так shm вроде только в первый раз делает системный вызов при получении идентификатора, не? Или там на каждое чтение/запись?
Если постоянные системные вызовы, то есть вариант кешировать значения в памяти процесса. Они все равно после создания не будут меняться. Главное что бы каждый процесс их получил после создания

Цитата Сообщение от ct0r Посмотреть сообщение
Каким образом ты их увеличишь?
Где то читал что это настраивается, какой то системный параметр должен быть.

Цитата Сообщение от ct0r Посмотреть сообщение
а внезапно какая-то другая программа их возьмет и отъест.
Ну что поделать... так и просто файл можно не суметь открыть

Добавлено через 5 минут
Цитата Сообщение от ct0r Посмотреть сообщение
Так что ты там сделал со вчерашнего утра? Уже написал пару строк shm_* (1 минута)? Работает?
Пока еще прикидываю варианты
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
16.02.2017, 17:38
Цитата Сообщение от sys_beginner Посмотреть сообщение
Так shm вроде только в первый раз делает системный вызов при получении идентификатора, не? Или там на каждое чтение/запись?
Каждый вызов shm_open ведет к вызову open, следовательно...?
Да, кстати, еще ограничения:
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.
То есть так-то тебе надо хэш строки пихать как строку, если по-хорошему.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Где то читал что это настраивается, какой то системный параметр должен быть.
Ну я и говорю, что должны быть права, чтобы что-то поменять.
И вообще, ограничение на кол-во открытых файлов не просто так появилось, если что.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Ну что поделать... так и просто файл можно не суметь открыть
Ага, если все будут писать такие программы, которые имя файла используют как ключ для каждого из кучи значений. Но, к счастью, такого не наблюдается.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
16.02.2017, 17:42  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
Каждый вызов shm_open ведет к вызову open, следовательно...?
Ну open это понятно что системный вызов, меня больше интересует не является ли чтение и запись системным вызовом...
Цитата Сообщение от ct0r Посмотреть сообщение
И вообще, ограничение на кол-во открытых файлов не просто так появилось, если что.
Насколько мне известно основная причина заключается в том, что на каждый дескриптор естественно требуется память а она не бесконечная. На скорость сомневаюсь что влияет

Цитата Сообщение от ct0r Посмотреть сообщение
Ага, если все будут писать такие программы, которые имя файла используют как ключ для кучи значений
Ок, какие предложения? Вариант с использованием БД вообще не вариант Согласись уже
Я не против другого варианта. Ищу оптимальный способ
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.02.2017, 18:38
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ок, какие предложения?
1) Выделить непрерывную область разделяемой памяти фиксированного размера.
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
Цитата Сообщение от sys_beginner Посмотреть сообщение
Интересно. А зачем здесь нужен аллокатор?
Аллокатор будет помнить какая часть шаред мемори уже занята под данные, а какая еще свободна.
Цитата Сообщение от sys_beginner Посмотреть сообщение
И вот еще что интересно: откуда выделять память в том случае когда индексы будут дублироваться(коллизии)?
Из области шаред-мемори которую вы уже запросили у системы, но еще не использовали под данные. Да, просить память у системы придется с запасом, чтоб на все эти коллизии хватило.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
17.02.2017, 09:59  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Из области шаред-мемори которую вы уже запросили у системы, но еще не использовали под данные. Да, просить память у системы придется с запасом, чтоб на все эти коллизии хватило.
Вот мне интересно как Вот набросок алгоритма. Есть непрерывный блок памяти и из него выделяется память под pair-ы. Допустим нам нужно всего 2 элемента, я взял с запасом место - для 4 элементов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
typedef std::pair<int, std::string> MyPair;
 
int main()
{
    std::size_t pool_size = sizeof(MyPair) * 4;
    
    char *mem = (char*)operator new (pool_size);
    
    MyPair *p1 = new(mem) MyPair(1, "hello");
    
    mem+= sizeof(MyPair);//смещение для индекса 2
    MyPair *p2 = new(mem) MyPair(2, "world");
}
Теперь предположим что индекс снова получится равным 2, в какую область памяти мне сместиться что бы занять для него место? Допустим на 3 т.к оно свободно. А что если в дальнейшем понадобится хранить под индексом 3 другой объект а эта область уже будет занята?

Добавлено через 10 минут
Свободную область можно отметить в аллокаторе и занимать её, приблизительно представляю как. Еще один map в шаред мемори.
Но каким образом получать доступ к элементам за константную сложность при таком раскладе? Линейного доступа ой как не хочется, ввиду этого изначально выбор сделал в сторону unordered_map
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.02.2017, 10:09
Цитата Сообщение от sys_beginner Посмотреть сообщение
Вот мне интересно как
Алгоритм buddy memory allocation - выделяет память за логарифмическое время. Но только кусками с размером кратным степени двойки. Так что четверть памяти у вас будет болтаться неиспользуемой.

Алгоритм дубовый, имени MsDOS - в начале каждого блока памяти, не важно занятого или свободного, записываете его размер и маркер "свободно/занято". Нужно выделить памяти - перебираете все блоки, пока не найдете свободный кусок достаточных размеров. Нужно освободить выделенную память - меняете маркер с "занято" на "свободно". Ну и при необходимости сливаете блок данных с его свободными соседями. Просто как три копейки, но весьма неспешно.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но каким образом получать доступ к элементам за константную сложность при таком раскладе?
Также как при использовании классического new. Аллокатор для шаред-мемори отличается от new только тем, что возвращает не адрес элемента, а его смещение от начала шаред-мемори.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
17.02.2017, 10:15  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Аллокатор для шаред-мемори отличается от new только тем, что возвращает не адрес элемента, а его смещение от начала шаред-мемори.
Я понимаю, но не представляю как это сделать когда у нас один непрерывный блок памяти. Удобно делать так: каждый индекс это смещение от начала на index * sizeof(Object). Других вариантов для непрерывного блока не вижу. Вроде бы те же векторы так и работают. Отсюда возникает вопрос как быть при работе с индексами, если будут коллизии?

Насколько я понимаю про константный доступ можно забыть? Те алгоритмы которые вы описали как я понял не дадут возможность реализовать доступ к памяти на чтение/запись за константное время
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.02.2017, 10:25
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Цитата Сообщение от sys_beginner Посмотреть сообщение
Я понимаю, но не представляю как это сделать когда у нас один непрерывный блок памяти.
Собрал на коленке, чисто продемонстрировать идею.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
char heap[1<<20];
void*endHeap=heap+sizeof(heap);
struct Header
{
    Header*next(){return (Header*)((char*)this+size);}
 
    size_t size;
    bool isFree;
};
 
void initHeap()
{
    Header*header=(Header*)heap;
    header->size=sizeof(heap);
    header->isFree=true;
}
 
void*myMalloc(size_t size)
{
    size+=sizeof(Header);
    for(Header*header=(Header*)heap; header<endHeap; header=header->next())
    {
        if(header->size>=size)
        {
            size_t unusedSize=header->size-size;
            if(unusedSize>sizeof(Header))
            {
                header->size=size;
                Header*newHeader=header->next();
                newHeader->size=unusedSize;
                newHeader->isFree=true;
            }
            header->isFree=false;
            return header+1;
        }
    }
    return nullptr;
}
Цитата Сообщение от sys_beginner Посмотреть сообщение
Насколько я понимаю про константный доступ можно забыть?
Причем тут доступ? Описанные мной алгоритмы накладывают ограничения на время выделения памяти. Ну так оно и у стандартного malloc есть.
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
Цитата Сообщение от sys_beginner Посмотреть сообщение
А заменить просто аллокатор у unordered_map нельзя потому что он не потокобезопасен насколько я понимаю.
Дело не в потокобезопасности, а в том что у каждого процесса независимое адресное пространство. Два идентичных указателя из разных процессов, в общем случае указывают на абсолютно разные данные. Просто потому что они в разных процессах. Нет, если вы можете гарантировать что указатель на шаред-мемори будет валиден во всех процессах, тогда просто меняйте аллокатор у unordered_map. Но судя по тому что я нагуглил, сделать подобное не то чтобы невозможно, но проблематично и не особо надежно. Если же валидность указателей вы гарантировать не можете, вам нужно тотально заменять их на смещения от начала heap. И я очень сомневаюсь что вы сможете объяснить unordered_map подобную замену. По крайней мере за время не превышающее переписывание unordered_map с нуля.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.02.2017, 10:48

Запись и считывание разделяемой памяти
Всем доброго времени суток. Столкнулся с одной проблемой. Есть две программы: 1 создаёт разделяемую память и записывает туда данные, а...

Хранение указателей в разделяемой памяти
Выручайте ребята. Задали лабораторную на взаимодействие процессов. Не могу справиться с сохранением указателей на структуры в...

Сделать массив из 10 int в разделяемой памяти
Хочу сделать массив из 10 int в разделяемой памяти. Доступ из разных процессов от fork(). Так понимаю, 19-20 строки должны сказать...

В чем основное преимущество разделяемой памяти
Подскажите в чем основное преимуществоразделяемой памяти

Прогон программ с использованием разделяемой памяти
/* Мы организуем разделяемую память для массива из трех целых чисел. Первый элемент массива является счетчиком числа запусков программы...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа для 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
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru