LMDB: открывать большие базы данных в системе с ограниченной памятью - PullRequest
0 голосов
/ 17 октября 2018

У меня есть программа, которая, по прогнозам, будет использовать несколько ГБ дискового пространства lmdb (это блокчейн, и мы уходим от leveldb из-за отсутствия ACID , который мне нужен для некоторых планов на будущее).Можно ли запустить эту программу с этой базой данных на Raspberry Pi без добавления дополнительного свопа ( с> 1 ГБ памяти )?(учитывая, что добавление свопа предназначено для опытных пользователей).

В настоящее время, когда я запускаю эту программу mdb_env_set_mapsize(1 << 30), следовательно, 1 ГБ размера карты , возвращается ошибка 12 , которой не хватает памяти.Но это работает, если я уменьшу размер до 512 МБ .

Но как правильно решать такие проблемы с памятью в lmdb, когда размер базы данных продолжает увеличиваться?

1 Ответ

0 голосов
/ 18 октября 2018

Максимальный размер памяти, который может быть отображен в памяти, зависит от размера виртуального адресного пространства, который определяется диспетчером виртуальной памяти ЦП.32-разрядный ЦП имеет ограничение в 4 ГБ виртуального адресного пространства, это ограничение для всей системы, если не включен PAE , в этом случае ограничение относится к процессу.

В дополнение кТаким образом, ядро ​​и ваше приложение резервируют некоторое собственное пространство в вашем адресном пространстве, а для выделения памяти обычно требуется непрерывное адресное пространство, что сокращает объем памяти, выделяемой для базы данных.

Таким образом, вашему пользователю потребуется либо включитьPAE в своей системе или обновите до 64-битного процессора.Если ни один из этих вариантов не подходит для вашего приложения, то вы не можете использовать файл отображения памяти, размер которого превышает доступное адресное пространство, поэтому вам придется выполнить некоторую сегментацию, чтобы разбить данные на несколько файлов, которые можно отобразить только на небольшие порции ввремя.Я предполагаю, что lmdb требует, чтобы он мог отобразить весь файл базы данных в память.

Для приложения блокчейна ваши данные в основном представляют собой линейную последовательность записей журнала, поэтому вашему приложению необходимо работать только ссамые последние записи большую часть времени.Вы можете разделить последние записи в своем собственном рабочем файле, а остальную часть журнала - в базе данных, для которой не требуется отображать весь файл в память или в несколько файлов фиксированного размера, которые можно отображать и удалять при необходимости.

...