【问题标题】:The way to write ten thousand data points to InfluxDB per second每秒向InfluxDB写入一万个数据点的方式
【发布时间】:2021-01-26 04:41:56
【问题描述】:

我正在使用树莓派 4 通过 python 脚本收集传感器数据。

喜欢:

val=mcp.read_adc(0)

每秒可以读取一万条数据。

现在我想保存这些数据以供 influx 进行实时分析。

我尝试在阅读时将它们保存到日志文件中,然后像 blog 那样使用 telegraf 进行收集:

但它对我的流数据不起作用,因为它太慢了。

我也试过用python的influxdb模块直接写,比如:

client.write(['interface,path=address,elementss=link value=3.14'],{'db':'db'},204,'line')

情况更糟。

那么如何才能将这些数据及时写入influxdb。有什么解决办法吗?

非常感谢!

顺便说一句,我是初学者,只能使用简单的python,好难过。

【问题讨论】:

  • 10k 数据(忽略你没有说这是什么的事实)/秒在树莓派上?
  • 我的大脑已经专注于这个。我只是无法理解您如何需要从如此无处不在的东西中存储如此多的信息,或者它将有什么用处。请给出上下文。
  • 对不起,我的疏忽,这是一个压电传感器。我用它来做脚步检测。来自 adc 的数据是浮点数据。系统必须具有“ns”级别的精度,因此需要大量数据。
  • 你认为 RPi 4 硬件应该足够快来完成这项任务吗?
  • 我已经测试过了。读取 10k 数据可能需要大约 0.8 秒。我可以在 1 秒内制作一个列表并通过 pickle 模块将它们打包。但是后来不知道如何及时将它们写入influxdb。

标签: python influxdb


【解决方案1】:

InfluxDB OSS 如果您对它们进行批处理,它们会更快地处理写入。您可以使用 python client has a batch parameter batch_size 来执行此操作。如果您正在阅读 ~10k 点/秒,我也会尝试大约 10k 的批量大小。应压缩批次以加快传输速度。

write 方法还允许将标签path=address,elementss=link 作为字典发送。这样做应该会减少解析工作。

您是否还在树莓派上运行 InfluxDB,还是通过网络连接从树莓派上发送数据?

我注意到您在 cmets 中说纳秒精度非常重要,但您没有在线路协议点示例中包含时间戳。如果时间如此关键,您应该自己提供时间戳。如果数据中没有明确的时间戳,InfluxDB 将在“数据到达时”插入一个时间戳,这是不可预测的。

如 cmets 中所述,您可能需要考虑在将这些数据发送到 InfluxDB 之前对其进行一些预处理。在不知道您如何处理压电数据以检测脚步声的情况下,我们无法提出建议。通常 ADC 值以小批量(10 - 100 次读取,具体取决于)进行平均,以减少噪声。假设您的脚步检测器连续运行,那么您每天将从单个传感器获得超过 7.5 亿个点。这是需要存储和后处理的大量数据。

如果您愿意,请编辑您的问题以包含移动信息。

【讨论】:

  • 是的,谢谢您的建议。我想将数据保存在树莓派上的本地 influxdb 中。上面的代码不完整。在保存到数据库之前,我会注意到时间戳。我想知道是否应该创建一个 for/while 循环并为每个点使用 write 方法。或者是其他东西。我不需要预处理。在 influxdb 中读取和保存 1w 点/秒是我的全部任务。
  • 1w points/sec - “1w”是多少?如果我的回答对您有帮助 - 请投票。试试 for 循环,让我们知道。您看到的“太慢”的 influxdb 错误是什么?
  • 大声笑,我的错误,10k 点/秒。我已经投票了。我使用 for 循环写 1000 个点可能需要 10 秒。特别奇怪,所以说太慢了。
  • 是的,这对你来说太慢了。我可能会在家里试试这个。非常有趣的问题。
猜你喜欢
  • 2016-02-08
  • 2021-01-05
  • 2017-12-15
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多