Android: Будет ли хранение данных датчиков/GPS часто ухудшать работу аккумулятора?

В настоящее время я пишу приложение для Android, которому нужно будет делать такие вещи, как:

  • Получение данных датчиков, таких как ActivityRecognition, скажем каждые 20-30 секунд
  • Получение данных GPS время от времени (например, когда распознавание активности отправляет, что пользователь использует свой велосипед или автомобиль), поэтому я бы сказал, что для среднего пользователя максимум несколько раз в день. Частота получения данных GPS может составлять, например, каждые 5-10 секунд.

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

Итак, если мы рассмотрим среднего пользователя, который будет генерировать около 5000 данных датчиков + 5000 данных GPS:

  • Как лучше хранить эти данные? База данных ? 1 файл в день? Я бы назвал базу данных из-за проблем с производительностью и простоты использования, но я не уверен, что это очень хорошая практика - открывать/закрывать соединение с базой данных каждые 10/20 секунд, чтобы добавить только одну строку данных. Кроме того, журналируемый файл (один в день) может быть хорошей идеей, но я думаю, что это довольно плохо с точки зрения производительности, даже при использовании сериализации?
  • Будет ли хранение этих 10 000 данных сокращать срок службы батареи намного больше, чем просто получение данных датчиков (ActivityRecognition, GPS) без хранения? Я имею в виду, мне кажется, что это будет немного перерасходовать, но в то же время GPS уже использует так много батареи ...
  • Есть ли другой способ сделать это?

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

заранее спасибо


person Pom12    schedule 17.06.2014    source источник
comment
Данные датчика, нет. GPS разряжает некоторые телефоны, но только пока он включен. Насколько я знаю, простое чтение не разряжает батарею; это то, что он включен. Если вам нужны данные, вам нужны данные.   -  person Robert Harvey    schedule 17.06.2014


Ответы (3)


По сравнению с расходом батареи GPS, чтение и запись в базу почти ничего не потребляет (в конце концов, это флэш-память), так что не беспокойтесь. На мой взгляд, база данных была бы лучшим вариантом для хранения этих данных, и я не вижу проблемы в создании одной записи каждые 10 или 20 секунд.

person tknell    schedule 17.06.2014
comment
Я бы предпочел подход к базе данных, и если вы хотите, вы можете реже записывать в базу данных, пока не будет достигнут предел локальной памяти, чтобы вы не часто открывали и закрывали базу данных. Но вы уже предлагали это. - person Jay Snayder; 17.06.2014

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

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

Если ваше приложение выйдет из строя из-за ошибки, некоторые данные будут потеряны, в зависимости от размера буфера. Во всех остальных случаях (устройство выключается, пользователь завершает работу приложения) у вас есть время для записи (сброса) буфера.

person AlexWien    schedule 17.06.2014
comment
Спасибо за ответ, но ваш ответ наводит меня на несколько вопросов: 1. Как часто вы бы рекомендовали передавать данные из буфера памяти в базу данных? Следует ли это делать каждые X минут или когда мы достигаем предела размера списка? Возможно оба ? Мне кажется, что, чтобы избежать потери памяти данных, я должен сохранять эти данные в базу данных, когда выполняется любое из двух условий (либо время, либо размер списка), я прав? 2. Интересно подумать, что я все еще могу сохранять данные памяти во время обычного выхода, но здесь я думаю, что не могу тратить слишком много времени на сохранение данных в методе onPause или аналогичном, он должен работать быстро... - person Pom12; 17.06.2014
comment
Сохранение этих небольших данных не займет много времени, если выполняется в одной транзакции. Кроме того, вы можете использовать AsyncTask для сохранения данных в onPause(), чтобы сохранение не блокировало методы жизненного цикла. - person tknell; 18.06.2014
comment
Да, хорошо, это хорошая идея, я проверю, выполняется ли сохранение в БД достаточно быстро, чтобы это можно было сделать непосредственно в onPause (это может быть...), в противном случае я просто сделаю это в AsyncTask. Большое спасибо. - person Pom12; 18.06.2014
comment
@ Pom12 1) Я использовал подход с ограничением размера списка, потому что это буфер, а у буфера есть размеры. Размер буфера может быть равен от 30 секунд до 5 минут. (30-300 локаций для частоты 1 локация/с) - person AlexWien; 18.06.2014

Просто короткое дополнение.

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

В общем смысле это означает

  1. нет опроса; вместо этого используйте прерывания,
  2. если вам нужно периодически просыпаться, чтобы посмотреть, не нужно ли что-то сделать, убедитесь, что ваш период прерывания является максимально допустимым. (Вопреки существующей практике пробуждение каждые 10 мс не улучшает вашу реакцию, когда среднее событие происходит каждые 500 мс.)

Это также относится к периферийным устройствам, поскольку они также переходят в спящие состояния, когда не активны (вызываются D-состояния).

  1. Сведите к минимуму количество обращений к облаку.
  2. Увеличьте время между доступами к облаку.
person Taylor Kidd    schedule 18.06.2014
comment
Я только что ответил на другой вопрос, который дает дополнительную информацию по вашему вопросу. См. stackoverflow.com/questions/24207590/ . - person Taylor Kidd; 18.06.2014
comment
Спасибо за дополнительное примечание. Что бы ни стоило, мне не нужно подключение к Интернету для работы вместе с GPS, поэтому доступ к облаку здесь не является предметом обсуждения. Вопрос в следующем: не следует ли поддерживать активным периферийное устройство, такое как GPS, если оно будет использоваться в течение того же периода времени, вместо того, чтобы выполнять несколько циклов перехода в режим сна/пробуждения, которые потенциально могут потреблять намного больше, чем при хранении. проснувшийся ? Я имею в виду, я полагаю, что поиск антенн (для GPS) требует очень много времени и энергии, поэтому я бы предпочел оставить его активным, если только он мне действительно не нужен в течение большого количества времени? - person Pom12; 19.06.2014