Эффективное использование MapDB (запутался в коммитах)

Я использую MapDB в проекте, который имеет дело с миллиардами объектов, которые должны быть отображены / поставлены в очередь. Мне не нужна какая-либо настойчивость после завершения программы (базы данных MapDB все временные). Я хочу, чтобы программа работала как можно быстрее, но я запутался в функции commit() MapDB (которая, как я полагаю, имеет отношение к производительности), даже после прочтения документации. Мои вопросы:

  1. Что именно делает коммит? Насколько я понимаю, он сериализует Объекты из кучи на диск, освобождая пространство кучи. Это точно?

  2. Что происходит с ссылками на объекты, которые были только что зафиксированы? GC очищает их или как-то "ссылается" на объект на диске (когда MapDB делает это прозрачным?)

В конечном итоге я хочу знать, как максимально эффективно использовать MapDB, но я не могу этого сделать, не зная, для чего предназначен commit(). Буду признателен за любые другие советы, которые вы могли бы дать для эффективного использования MapDB.

2 ответа

Решение

commit Операция - это операция с транзакциями, такая же, как в системе баз данных. MapDB реализует транзакции, поэтому commit эффективно "сделать изменения, которые я сделал в этой БД, постоянными и видимыми для других пользователей". Бесплатная операция rollback, который отменяет все изменения, которые вы внесли в текущую транзакцию. Фиксация (напрямую) не влияет на то, что находится в памяти, а что нет. Вы можете посмотреть на compact() вместо этого, если вы пытаетесь восстановить кучу пространства.

Что касается вашего второго вопроса, если вы держите сильную ссылку на объект, то вы продолжаете держать эту сильную ссылку. MapDB не собирается удалять его для вас. Вы должны думать о MapDB как о обычной карте Java, большую часть времени. Когда вы звоните getMapDB скрывает, находится ли он в памяти или на диске от вас, и просто возвращает вам полезную ссылку на найденный объект. Этот извлеченный объект будет висеть в памяти, пока не станет мусором, как и все остальное.

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

лайк

  • каждый N изменения
  • каждый M секунд
  • После каких-то логических контрольных точек в вашем коде.

Выполнение слишком большого количества коммитов сделает ваше приложение очень медленным.

Другие вопросы по тегам