Как ускорить запись данных в Infxdb с помощью Python на raspberry pi - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над быстрым регистратором данных на основе Raspberry Pi. Идея состоит в том, чтобы использовать Pi для взаимодействия с акселерометром lis3dh через SPI как можно быстрее и отправлять данные в infxdb как временные ряды. Я не уверен, что это безумие, но я планировал использовать sh ограничение в 5 кГц в качестве частоты выборки.

Моя первая реализация - получить данные для точного притока с использованием Python, но я ' Я бы хотел улучшить все.

Вот часть моего кода, который отправляет данные в том виде, в каком они записаны:

# Loop above that is keeping track of run time and other user control ^

# Setup the variables
lastSampleTime = time.time()
measurement = "accel"
location = "location1"
# May need to include additional location in future

# Run the periodic sampling
while (time.time() - lastSampleTime) < SampleTime:

# Get Values from the device in a list[x, y, z]
AccelData = GetReadingsNow(lis3dh)

# Obtain current time
timenow = time.time_ns()

# construct the data to be sent
data = [{
  "measurement": measurement,
  "tags": {
    "location": location,
  },
  "time": timenow,
  "fields": {
    "x": Accels[0],
    "y": Accels[1],
    "z": Accels[2]
  }
}]

# Send the JSON data to InfluxDB
client.write_points(data)    

Согласно документации по притоку, для ускорения записи нужно использовать пакетную написать в db. Но вот мой вопрос.

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

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 22 июня 2020

Вы знаете, где находится текущее узкое место? Это GetReadingsNow(lis3dh), сетевой ввод-вывод, InfluxDB, комбинация и т. Д. c.? Работает ли InfluxDB также на Pi? 1007 *

Да, использование одного потока для чтения с устройства и другого для отправки показаний в InfluxDB будет работать и может решить проблему. Вот ответ с простым примером использования потоков в Python. Надеюсь, пример кода в приведенном выше ответе поможет в этом. Поток 1 будет считывать значения с устройства и добавлять их в список (действуя как буфер). Когда список содержит 5К (или некоторое разумное количество) значений, он помещает их в очередь. Затем он создаст новый список и начнет сохранять в нем значения. Поток 2 извлекает списки значений из очереди и отправляет их в InfluxDB. Поскольку поток 1 всегда создает новый список после добавления списка в очередь, вам никогда не придется беспокоиться о том, что изменилось. Поток 2 просто берет список значений из очереди и отправляет его. Я не уверен, что понимаю, какие данные теряются. Если под потерянным вы подразумеваете недостижение полной частоты дискретизации 5K, то сначала вам нужно сделать, как предложено выше, найти узкое место и устранить его.
...