Как мне эффективно использовать память для обработки данных базы данных ObjectBox?

#android #database #kotlin #objectbox

#Android #База данных #kotlin #objectbox

Вопрос:

Я работаю над приложением Kotlin на Android. Я использую интерфейс ObjectBox для Kotlin для хранения до 40 миллионов объектов с точками данных. Я хочу загрузить и удалить их из базы данных. Я делаю это, извлекая списки из 100000 объектов и загружая их, а затем удаляя их из базы данных по одному списку за раз. При быстром сетевом подключении это создает проблему, заключающуюся в том, что задания загрузки работают быстрее, чем сборщик мусора очищает уже загруженные объекты из ОЗУ. Я получил эту информацию, просмотрев следующий журнал, который появляется более одного раза в секунду.

2021-01-13 16:58:04.280 27936-27951/ project I / e.проект: Фоновое янг одновременное копирование GC освободило 175472 (7966 КБ) объектов распределенного пространства, 10 (1292 КБ) объектов LOS, 25% свободного, 23 МБ / 31 МБ, приостановлено 1,295 МС, всего 169,984 мс

Загрузка значительно замедляется через короткое время, и регулярно появляются другие ошибки памяти.

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

Мои идеи были:

  1. Повторно используйте одни и те же 100.000 объектов на каждой итерации. Таким образом, имея только один список объектов данных и после их загрузки, чтобы заполнить данные следующих 100.000 записей из базы данных в уже существующие объекты. Таким образом, они не должны были бы очищаться GC до тех пор, пока все данные не будут загружены. Для этого потребуется метод для сохранения результата запроса в существующий объект / список объектов. Я не смог найти это в документации ObjectBox.
  2. Считывайте данные как какой-то поток из базы данных и вообще не представляйте их как объекты во время загрузки. Я также не смог найти эту функциональность в Objectbox.

Знаете ли вы о функциональности ObjectBox, позволяющей использовать один из этих подходов? Знаете ли вы другой подход к решению этой проблемы?

В настоящее время я запрашиваю данные с помощью

верните sensorDataBox.запрос { }.find(смещение = 0, ограничение = 100000)

Ранее я полагался на

sensorDataBox.запрос { }.findLazy()

но с более чем 40 миллионами объектов в коробке даже отложенные списки были слишком большими, чтобы получить все объекты сразу. И нет никакого параметра ограничения для запроса отложенных списков. Поэтому мне пришлось вернуться к .find(смещение, ограничение).

Если вам нужно, чтобы я предоставил дополнительную информацию, пожалуйста, попросите об этом!

Комментарии:

1. Как вы в настоящее время получаете пакет из 100 тыс. объектов? Некоторый код поможет ответить на этот вопрос.

2. Например, если вы используете запрос для получения пакета, использование отложенного списка уже может помочь: docs.objectbox.io/queries#lazy-loading-results