Самый большой размер карты LMDB в Ubuntu, работающий в подсистеме Windows для Linux - PullRequest
0 голосов
/ 03 ноября 2018

Перед созданием новой базы данных я установил размер карты LMDB равным 5 ГиБ с помощью его собственной функции C mdb_env_set_mapsize(), и все коды возврата этой и других функций LMDB, необходимые для работы с базой данных, указывают на успех.

Однако, как только я начинаю использовать единственную безымянную базу данных в среде LMDB, я получаю сообщение об ошибке «карта заполнена» после того, как база данных увеличится до 1 ГиБ.

Я проверил доступную память в окне bash с помощью free -m и увидел, что используется 6,7 ГБ памяти, а 9,4 ГБ свободно .

Моя интуиция говорит мне, что это проблема ОС, а не проблемы LMDB. Кто-нибудь знает, где я мог бы начать диагностировать (и исправить) первопричину?

Использование:

  • Windows 10 вер. 1803, сборка 17134,345
  • Ubuntu ver. 16.04 в рамках WSL
  • LMDB вер. 0.9.17-3
  • 16 ГиБ физической памяти

1 Ответ

0 голосов
/ 09 ноября 2018

Я почти воздержался от публикации смущающего ответа ... оказывается, это не проблема ОС или LMDB. Сводка исходного кода, обеспечивающего максимальный размер карты 1 ГБ, составила:

#include <unistd.h>
#include <lmdb.h>

int pageSize;
MDB_env *env;

pageSize = getpagesize();   /* OS-dependent number of bytes in a memory page */
mdb_env_create(&env);
mdb_env_set_mapsize(env, (int)(5*1024*1024*1024 / pageSize) * pageSize);
...

Преступник типа int, представленный для округления, в последней функции был виновником. Изменение на long int решило проблему. Радости C ...

...