Я использую прослушиватель Firebase onChildAdded
для хранения определенных частей данных в моем приложении для Android. Когда приложение запускается, это может срабатывать тысячи раз. Каждый раз, когда это срабатывает, я использую SharedPreferences apply
, чтобы написать простую пару ключ/значение. Ключи и значения сами по себе не очень большие, но в SharedPreferences может быть несколько тысяч.Повторные вызовы для SharedPreferences apply() вызывает OutOfMemoryError
Я был в восторге от использования apply
, потому что он делает некоторую магию вокруг кэширования в памяти и задерживает фактические XML-записи SharedPreferences. Тем не менее, я нахожу, что если я вызову apply
1000-2000 раз в течение нескольких секунд, я получаю ошибку OutOfMemory.
Внутренний, SharedPreferencesImpl, кажется, создает новый Map
, основанный на старых Map
, если записи в фактический XML по-прежнему находятся в очереди. Тем не менее, это вызывает то, что кажется несколько тысяч записей Map
на куче Java (я считаю), и я получаю ошибку OutOfMemory
.
Может быть, мне нужно позвонить commit
каждые 50 или около того раз, когда я звоню apply
- таким образом я не буду сталкиваться с ошибками OutOfMemory, хотя я могу заметить небольшой удар производительности? Что мне делать? В любом случае это похоже на хакки.
Общие предпочтения не предназначены для хранения таких больших данных. Вы должны выбрать базу данных sql вместо –
Мне трудно поверить, что SharedPreferences не может хранить несколько тысяч пар ключ/значение, где каждый ключ и значение всего несколько символов (максимум 50). –
Да, но это проблема с вашим кодом –