Почему запись в базу данных SQLITE в памяти намного медленнее, чем использование ArrayList? - PullRequest
0 голосов
/ 13 октября 2011

У меня есть приложение, которое собирает много информации и хранит эту информацию в ArrayList.

Подробно этот ArrayList определен как ArrayList<FileInformation>, который имеет некоторый член, такой как:

private File mFile;
private Long mSize;
private int mCount;
private Long mFilteredSize;
private int mFilteredCount;
private int mNumberOfFilters;

и т.д.

Этот подход работает, но не очень гибок, когда я хотел бы представить некоторые новые функциональные возможности. Он также имеет некоторые ограничения с точки зрения использования памяти и масштабируемости. Из-за этого я провел несколько тестов, если база данных - лучший подход. От гибкости нет сомнений, но почему-то я не могу заставить ее работать достаточно быстро, чтобы стать реальной альтернативой.

Сейчас в базе данных есть только одна таблица, подобная этой:

CREATE TABLE ExtContent (
                        "path" TEXT not null, 
                        "folderpath" TEXT not null, 
                        "filename" TEXT,
                        "extention" TEXT,
                        "size" NUMERIC,
                        "filedate" NUMERIC,
                        "isfolder" INTEGER not null,
                        "firstfound" NUMERIC not null,
                        "lastfound" NUMERIC not null,
                        "filtered" INTEGER not null
                       );

Проблема производительности огромна. Сбор и запись ~ 14000 предметов занимает ~ 3 минуты ! при записи в базу данных и просто 4-5secs , если записано в ArrayList. Создание базы данных в памяти не имеет большого значения.

Поскольку мой опыт работы с SQLITE довольно ограничен, я начал с создания записей с помощью метода android.database.sqlite.SQLiteDatabase.insert.

Поскольку не было значимой разницы между файловой базой и базой данных в памяти, я думаю, использование BEGIN TRANSACTION и COMMIT TRANSACTION не будет иметь никакого значения.

Есть ли способ оптимизировать это поведение?

Ответы [ 3 ]

3 голосов
/ 21 июня 2012

Только для пояснения, установка BEGIN TRANSACTION и END TRANSACTION значительно увеличит производительность. Цитируется http://www.sqlite.org/faq.html#q19:

SQLite будет легко выполнять 50 000 или более операторов INSERT в секунду на обычном настольном компьютере. Но он будет делать только несколько десятков транзакций в секунду. По умолчанию каждый оператор INSERT является собственной транзакцией ...

2 голосов
/ 13 октября 2011

У меня была похожая проблема в приложении, которое я кодировал на выходных.

Должны ли данные в базе данных включаться в приложение после его выпуска? Если это так, то массовые вставки - это не лучший способ, вместо этого вы хотите посмотреть на создание базы данных и включение ее в каталог assets и ее копирование на устройство. Вот отличная ссылка .

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

Редактировать: Вы также можете опубликовать свой код insert.

1 голос
/ 13 октября 2011

Это совершенно очевидно. Предполагая, что вы уже выделили объект для вставки. (Это та же самая нагрузка для бот-решений). Давайте сравним альтернативы:

  • Вставка в ArrayList делает: - (необязательно), при необходимости, выделять новые ячейки ячеек для указателей. - вставить указатель объекта в список массивов в конце ... очень быстро
  • Вставка в sqlite: -подготовить запрос на вставку (надеюсь, вы используете подготовленный запрос, а не строите его из строк) - выполнить вставку таблицы базы данных с изменениями индексов и т. д. ... много работы

Единственное преимущество базы данных в том, что вы можете: - запросите это позже - прозрачно обрабатывает внешнее хранилище, позволяя вам иметь гораздо больше объектов Но это происходит за счет производительности.

В зависимости от того, для чего вы работаете, могут быть лучшие альтернативы.

Например, в моих играх для Android я храню записи рекордов в файле JSON и использую GSON Потяните слой парсера / привязки данных (https://github.com/ko5tik/jsonserializer), чтобы создать из него объекты. Типичное время загрузки 2000 записей из внешнего хранилища составляет около 2-3 секунд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...