читать большие текстовые файлы с сервера Android

1

Я работал в Android-приложении, которое читало большой текстовый файл с сервера (20 МБ) по очереди, после каждой строки вставлять в SQL-данные SQL некоторые данные, извлеченные из этой строки и так далее.

проблема в том, что это приложение занимает около часа, чтобы закончить чтение этого файла. примечание: в этом файле 400 000 строк.

как я могу ускорить эту операцию за 3 или 4 минуты? Спасибо за вашу помощь.

    public void readArData() {
    try {
        URL url = new URL("http://10.0.2.2/xy.txt");
        BufferedReader in = new BufferedReader(new   
    inputStreamReader(url.openStream()));
        String str;
        while ((str = in.readLine()) != null) {
            // insert into Sqlite DB
        }
        in.close();
    } catch (MalformedURLException e) {
    } catch (IOException e) {
    }

}
Теги:

3 ответа

1
Лучший ответ

Текстовые файлы сильно сжимаются, поэтому используйте сжатие gzip, доступное на Android.

Другие варианты:

  • разбивая ваш набор данных на несколько файлов и снова используя gzip, загружайте их отдельно

  • засеивание базы данных во время установки и создание метода синхронизации для обновления новых записей и доведение актуальной версии мобильных устройств. \

  • удалять избыточные данные с использованием эффективного дизайна базы данных и загружать только то, что требуется

ОБНОВИТЬ

Чтобы уточнить:

  1. zip файл txt на сервере.
  2. измените свой код Android для загрузки zip файла в локальное хранилище на устройстве.
  3. разархивируйте локальную копию на локальное хранилище.

Теперь у вас должна быть копия вашего txt файла на локальном хранилище, чтобы вы могли удалить локальный zip файл.

  1. Прочтите локальный файл txt и вставьте записи базы данных.

Основные различия в этом подходе

а. что вы загружаете меньше данных b. загрузка не прерывается sql-вставками.

Вы также можете попробовать использовать транзакцию для улучшения скорости вставки, как описано в базе данных Android SQLite: медленная вставка

db.beginTransaction();
for (entry : listOfEntries) {
    db.insert(entry);
}
db.setTransactionSuccessful();
db.endTransaction();
  • 0
    Хорошо, я попробую это, но чтение из внутренней памяти быстрее, чем чтение с сервера? Значит, есть большая разница между двумя операциями (чтение из внутренней памяти или с сервера)?
  • 0
    большая разница здесь в использовании gzip. сделать это в 6-7 раз быстрее. это первое, что вы должны сделать.
Показать ещё 4 комментария
2

Вы уверены, что 3 - 4 минуты - это достижимое количество времени? Я прошу, потому что вы должны:

1) Загрузите содержимое файла 2) Разберите содержимое файла 3) Вставьте в базу данных

Некоторые из этих операций могут выполняться одновременно, но # 1 сильно зависит от скорости сети, а 2/3 сильно зависят от того, какие системные ресурсы у вас имеются.

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

Короче говоря, я думаю, нам нужно больше данных для анализа вашей проблемы. Можете ли вы опубликовать несколько примеров строк из.txt и кода, который вы используете для его анализа?

  • 1
    Возможно, вы захотите рассмотреть предварительную обработку файла на сервере, а затем скопировать его на телефон. Я думаю, что можно скопировать полностью загруженную базу данных SQLite на телефон с сервера.
  • 1
    +1, если у вас 400 000 строк и вы хотите сделать это за 4 минуты, это 100 000 вставок SQL каждую минуту, 1666 в секунду. Кажется, что много нужно спросить с мобильного устройства, особенно если вам нужно выполнить некоторую обработку строк.
0
  1. убедитесь, что у вас есть 20 мб места на внутренней памяти или SD-карте.
  2. Загрузите файл все сразу, лучше, если застегнуть молнию. (поскольку он будет весом около 3-4 мб)
  3. то вы можете открыть его и проанализировать. Используйте запросы, которые вставляют больше строк подряд (проверьте синтаксис sqlite INSERT).
  4. удалите файл.

этот подход также позволит вам возобновить прерванную загрузку, что неплохо.

  • 0
    спасибо, я попробую это также
  • 0
    это точно так же, как обновление, которое я предоставил вчера. Пожалуйста, не публикуйте повторяющиеся ответы.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню