У меня есть программа, которую планируется использовать несколько ГБ дискового пространства lmdb (это блокчейн, и мы отходим от LevelDB из-за его отсутствие кислоты, что мне нужно для некоторых планов на будущее). Можно ли запустить эту программу с этой базой данных на Raspberry Pi без добавления дополнительного свопа (с> 1 ГБ памяти)? (учитывая, что добавление свопа для продвинутых пользователей).
В настоящее время, когда я запускаю эту программу mdb_env_set_mapsize(1 << 30)
, следовательно 1 ГБ карты, Это возвращает ошибку 12, который не хватает памяти. Но это работает, если я уменьшу размер до 512 МБ.
Но как правильно обрабатывать такие проблемы с памятью в lmdb, когда размер базы данных продолжает увеличиваться?
Максимальный размер памяти, который может быть отображен в памяти, зависит от размера виртуального адресного пространства, который определяется диспетчером виртуальной памяти ЦП. 32-разрядный ЦП имеет ограничение 4 ГБ виртуального адресного пространства, это ограничение для всей системы, если только PAE включен, и в этом случае ограничение на процесс.
В дополнение к этому ядро и ваше приложение резервируют некоторое собственное пространство в вашем адресном пространстве, а для выделения памяти обычно требуется непрерывное адресное пространство, что уменьшает объем памяти, выделяемой для базы данных.
Таким образом, ваш пользователь должен будет либо включить PAE в своей системе, либо перейти на 64-битный процессор. Если ни один из этих вариантов не подходит для вашего приложения, то вы не можете использовать файл отображения памяти, размер которого превышает доступное адресное пространство, поэтому вам придется выполнить некоторую сегментацию, чтобы разбить данные на несколько файлов, которые можно отобразить только на небольшие порции в время. Я предполагаю, что lmdb требует, чтобы он отображал весь файл базы данных в память.
Для приложения блокчейна ваши данные в основном представляют собой линейную последовательность записей журнала, поэтому вашему приложению большую часть времени нужно будет работать только с самыми последними записями. Вы можете разделить последние записи в своем собственном рабочем файле, а остальную часть журнала — в базе данных, для которой не требуется отображать весь файл в память или в несколько файлов фиксированного размера, которые можно отображать и удалять при необходимости.
Других решений пока нет …