2016-10-14 2 views
0

Я пишу встроенное приложение, которое считывает данные из набора датчиков и загружает их на центральный сервер. Это приложение написано на Python и работает на блоке Rasberry Pi.Буферизация данных/хранение - Python

Данные необходимо собирать каждые 1 минуту, однако подключение к Интернету нестабильно, и мне нужно буферизовать данные в энергонезависимой памяти (SD-карту) и т. Д., Когда соединение отсутствует. Буферизованные данные должны быть загружены как и когда соединение вернется.

В настоящее время я собираюсь хранить буферизованные данные в базе данных SQLite и писать задание cron, которое может непрерывно считывать данные из этой базы данных и загружать их.

Есть ли модуль python, который можно использовать для такой функции?

ответ

-1

Это только работа с базой данных. Вы можете создать основную и подчиненную базы данных в разных местах, а если нет в сети, она будет работать с последней синхронизированной информацией.

И когда соединение вернулось, слияние всех данных.

Взгляните на эту answer и поиск ведущего и ведомого базы данных

+0

он встроен в систему с возможными настройками десятков или сотен главных/подчиненных устройств. Оверкаль – valentin

0

Если вы имеете в виду модуль для работы с базой данных SQLite, проверить SQLAlchemy.

Если вы имеете в виду модуль, который может делать то, что делает cron, посмотрите sched, планировщик событий python.

Однако, это выглядит как идеальное место для implemet очереди задач --использование выделенного брокера задачи (RabbitMQ, Redis, ZeroMQ, ..), или Питона threads и queues. В общем, вы хотите отправить задание на загрузку, а рабочий поток подберет ее и выполнит, а брокер задач обработает повторы и сбои. Все это происходит асинхронно, не блокируя основное приложение.

UPD: Чтобы уточнить, вам не нужна база данных, если вы используете брокер задач, потому что брокер задач хранит задания для вас.

+0

может быть решением задачи на основе zeromq. – valentin

+0

после того, как немного поработал в Google, я вижу, что ZeroMQ кажется хорошей проблемой для pasp. Пример того, как его настроить: http://www.pihomeserver.fr/ru/2014/01/15/raspberry-pi-home-server-le-message-broker-zeromq-pour-lier-vos-machines/ –

0

Есть ли модуль python, который можно использовать для такой функции?

Я не знаю о каком-либо легко доступном модуле, однако он должен быть совершенно прямым для его создания. Учитывая ваши требования:

Подключение к Интернету нестабильно, и мне необходимо буферизовать данные в энергонезависимой памяти (SD-карту) и т. Д., Когда нет соединения. Буферизованные данные должны быть загружены как и когда соединение вернется.

алгоритм выглядит примерно так (псевдо-код):

# buffering module 
data = read(sensors) 
db.insert(data) 

# upload module 
# e.g. scheduled every 5 minutes via cron 
data = db.read(created > last_successful_upload) 
success = upload(data) 
if success: 
    last_successful_upload = max(data.created) 

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

Есть несколько случаев края, однако, что вам нужно беспокоиться, чтобы сделать эту работу надежно:

  1. вставки данных при загрузке в ходе
  2. SQLlite не поддерживает осуществляется доступ из нескольких процессов скважина

Для решения этой проблемы вы можете захотеть рассмотреть другую базу данных или создать несколько баз данных SQLite или даже плоские файлы для каждой партии загрузок.

+0

Спасибо @miraculixx, это хорошая рекомендация. Я, вероятно, поеду с отдельными файлами. – user730936

Смежные вопросы