#in-memory-database
#база данных в памяти
Вопрос:
Я нахожусь в процессе реализации локальной компьютерной базы данных, которая позволяет мне передавать информацию и данные между программами C и fortran (C для потока управления, fortran для вычисления матриц).
Я понимаю идею базы данных в памяти, но как программы получают из нее данные? Нужно ли мне открывать локальные порты и просто иметь регулярное подключение к нему? Есть ли другой системный вызов более низкого уровня или что-то, что позволяет мне напрямую взаимодействовать с программами?
В моей голове я мечусь между созданием большой программы на языке Си, которая запускает базу данных внутри нее, а также вычисление матрицы фортрана (не непосредственно в базе данных), и просто сохраняю ее в двоичном файле и открываю ее между программами.
Я также понимаю, что использовать чужое программное обеспечение было бы проще и быстрее, но я хочу сделать это сам, чтобы улучшить свое понимание и навыки программирования.
Комментарии:
1. Похоже, вы занимаетесь распределенными вычислениями. Рассмотрите возможность использования MPI. Также подумайте об использовании научных библиотек, таких как BLAS и LAPACK.
Ответ №1:
Я не могу говорить с redis, но я могу рассказать вам о внедрении моей компании: eXtremeDB.
eXtremeDB написан в основном на C (C для SQL, некоторые сборки, например, для спиновых блокировок). Мы предлагаем собственные и SQL API для многих языков, которые могут использоваться взаимозаменяемо.
Для сценария со смешанным языком, как вы описываете, база данных будет создана в общей (именованной) памяти, которая сопоставляется с адресным пространством каждого процесса. Как таковая, это «встроенная» база данных. Сама среда выполнения базы данных-это общие библиотеки, которые связываются с приложением. Итак, это соответствует вашему описанию «большая программа на языке Си, которая запускает базу данных внутри». Вы можете заменить «fortran» на » C » соответствующим образом.
Соответственно, процессы имеют прямой и очень быстрый доступ к хранимым данным через опубликованные интерфейсы (т. е. никаких накладных расходов на взаимодействие между процессами по сравнению с архитектурой клиент/сервер) . Среда выполнения базы данных управляет параллельным доступом. «доступ» может осуществляться через SQL (ВЫБЕРИТЕ * ИЗ таблицы, ГДЕ…) или через собственный API. Конечно, собственный API работает быстрее. И для собственного подхода, гораздо более удобного (реализация SQL-движка-это большое дело).
Вероятно, вам захочется реализовать интерфейс «загрузка» и «хранение» для сохранения и перезагрузки базы данных в памяти между запусками. Это довольно просто; База данных в памяти будет существовать в непрерывном фрагменте памяти (например, используйте операции с общей памятью вашей операционной системы, чтобы выделить 5 МБ общей памяти и сопоставить ее с локальным адресным пространством), которую можно просто передавать на постоянные носители. Это означает, что вы создадите суб-распределитель во время выполнения базы данных, чтобы распределять меньшие куски для хранения объектов. Если в базе данных с общей памятью существуют связи между объектами, убедитесь, что они хранятся как смещения по сравнению с прямыми ссылками на указатели, поскольку нет гарантии, что база данных будет сопоставлена с тем же начальным адресом памяти при последующем запуске.
Комментарии:
1. Это очень описательно и именно то, что я хотел, спасибо!