LINUX.ORG.RU

История изменений

Исправление Deleted, (текущая версия) :

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

Если я правильно вас понял, то вы спрашиваете про какую-то свою библиотеку, а не про libmdbx. Ибо в libmdbx такое расширение на ходу работает, достаточно задать параметры посредством mdbx_env_set_geometry(). Т.е. необходимо и достаточно задать нужные минимальный и максимальный размер, а также адекватные шаги приращения/уменьшения. Но вот менять верхний предел размера без необходимости не стоит, ибо для этого необходимо менять резервируемый размер адресного пространства, которое может быть занятым (особенно на 32-битных платформах).

В Windows нет официального метода изменять размер отображения, но есть неофициальный способ наращивать размер отображенной секции. Этот метод работает во всех версиях, подробности см исходный код функций mdbx_mmap() и mdbx_mresize(), в особенности вызов NtExtendSection().

Тем не менее, в Windows нельзя уменьшить размер отображения, в том числе уменьшить размер самого файла. Поэтому в libmdbx уменьшение производиться посредством полного unmap+map с приостановкой тредов на время ре-маппинга. Но и это не всегда помогает, так как уменьшить размер файла возможно только если нет других процессов, в которых он отображен в память в текущем размере.

Исходная версия Deleted, :

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

Если я правильно вас понял, то вы спрашиваете про какую-то свою библиотеку, а не про libmdbx. Ибо в libmdbx такое расширение на ходу работает, достаточно задать параметры посредством mdbx_env_set_geometry(). Т.е. необходимо и достаточно задать нужные минимальный и максимальный размер, а также адекватные шаги приращения/уменьшения. Но вот менять верхний предел размера без необходимости не стоит, ибо для этого необходимо изменит резервируемый размер адресного пространства, которое может быть занятым (особенно на 32-битных платформах).

В Windows нет официального метода изменять размер отображения, но есть неофициальный способ наращивать размер отображенной секции. Этот метод работает во всех версиях, подробности см исходный код функций mdbx_mmap() и mdbx_mresize(), в особенности вызов NtExtendSection().

Тем не менее, в Windows нельзя уменьшить размер отображения, в том числе уменьшить размер самого файла. Поэтому в libmdbx уменьшение производиться посредством полного unmap+map с приостановкой тредов на време ре-маппинга. Но и это не всегда помогает, так как уменьшить размер файла возможно только если нет других процессов, в которых он отображен в память в текущем размере.