Android sqlite / BLOB проблема производительности - PullRequest
4 голосов
/ 06 декабря 2011

С тех пор, как я переместил свои данные из ArrayList в базу данных sqlite на Android, у меня серьезное падение производительности. Нет открытых курсоров, которые могли бы вызвать это, поэтому я подозреваю, что проблема связана с изображениями, которые я храню в поле BLOB.

Приложение создает Карты с полем cardBitmap , которое заполняется растровым изображением при создании.

Может кто-нибудь сказать по своему опыту, какое решение более производительно:

  1. cardBitmap содержит ссылку (путь) к файлу на SD-карте, который будет нарисован при создании. В БД хранится только путь.
  2. cardBitmap содержит объект ( BitmapFactory.decodeStream (imageStream, null, null) ), где imageStream читается как ByteArrayInputStream из соответствующего поля базы данных.

Любые предложения будут полезны. Спасибо!

Ответы [ 3 ]

10 голосов
/ 11 февраля 2013

У меня пока нет репутации, чтобы комментировать ответ, поэтому вместо этого я добавлю свои 2cts в качестве ответа, пожалуйста, прости меня.

Я искал ответ на подобный вопрос, и я не думаю, что текущий ответ удовлетворителен, потому что если вы спросите SQLite.org, они скажут вам, что это зависит от размера BLOB-объекта и размера страницы.

Они выполнили эталонный тест - не на Android, хотя - который показывает, что хранение больших двоичных объектов в SQLite быстрее для небольших больших двоичных объектов (до 20 КБ), чем для хранения отдельных файлов. Однако для больших двоичных объектов размером более 100 КБ падение производительности велико, и лучше хранить большие двоичные объекты в отдельных файлах, как вы (user370605) рекомендуете. Смотри http://www.sqlite.org/intern-v-extern-blob.html

Я рассмотрю вопрос без ответа относительно Android.

8 голосов
/ 06 декабря 2011

Ваше первое решение лучше . Используйте файл с SDCard и сохраните ссылочный путь в вашей базе данных sqlite. Это даст вам более высокую производительность, и ваша база данных останется легкой.

1 голос
/ 20 сентября 2016

У меня недостаточно репутации, чтобы делать комментарии. Я добавляю этот ответ, чтобы помочь любому, кто все еще ищет какое-то предложение. После нескольких лет усовершенствования оборудования производительность этих двух решений практически не изменилась. Я несколько раз пытался в своем Nexus 6p записать двоичный образ размером около 2 МБ в SQLite, который занимает в среднем всего 50 мс. Хотя внешнее хранилище будет работать лучше, текущая производительность может оправдать мои ожидания. Для записи в SQLite не требуется разрешение WRITE_EXTERNAL_STORAGE, которое может быть отменено, если разрешение предоставлено другими приложениями. В этом случае SQLite может быть хорошим выбором.

...