1

我正在使用 Raspberry Pi 创建一个气象站。我为不同的传感器(温度、湿度、压力、雨水等)设置了一个 mySQL 数据库,现在开始处理风传感器。

我有一个 python 程序,它监视风速计的 GPIO 引脚并计算脉冲以计算风速。它还通过 ADC 从风向标过程中读取数据以获取方向。对于其他传感器,我只每隔几分钟处理一次,并将数据直接转储到数据库中。因为我要从风传感器数据中计算很多东西,我不一定要每 5 秒写入一次 DB,然后必须读回过去 5 分钟的数据来计算当前的速度和方向。我想收集内存中的数据,进行处理,然后将最终数据写入数据库。传感器读数类似于:

日期时间、速度、方向
2013-6-20 09:33:45, 4.5, W
2013-6-20 09:33:50, 4.0, SW
2013-6-20 09:33:55, 4.3, W

该程序每 5 秒计算一次来自风传感器的数据。我想每 5 分钟将数据写入数据库。因为数据库在 SD 卡上,我显然不想写入数据库 60 次,然后读回处理它,然后每 5 分钟将其写入永久存档数据库。

使用列表列表会更好吗?还是按日期时间键控的元组字典?
{datetime.datetime(2013, 6, 20, 9, 33, 45, 631816): ('4.5', 'W')}
{datetime.datetime(2013, 6, 20, 9, 33, 50, 394820): ('4.0', 'SW')}
{datetime.datetime(2013, 6, 20, 9, 33, 55, 387294): ('4.3', 'W')}

对于后者,更新字典的最佳方法是什么?我应该把它转储到数据库并读回来吗?对于这么少的数据,这似乎每天的读/写量过多。

4

3 回答 3

1

Python 程序和数据库之间有多个缓存层。特别是,Linux 磁盘块缓存可能会根据使用模式将您的数据库保持在核心中。因此,您不应该假设写入数据库和回读一定比您放入应用程序中的一些自制缓存慢。而且,您为过早优化数据库而编写的代码将比您不编写的代码具有无限多的错误。

对于您指定的工作负载,相对于 SQLite,MySQL 让我觉得有点重量级,但您可能有未说明的理由需要它。

于 2013-06-20T16:19:10.710 回答
0

一种选择是使用redis来存储您的数据。这是一个键值存储,非常适合存储您所说的数据。它在内存中运行并将数据写入磁盘以实现持久性,这是可配置的,因此您可以使其每隔几个小时或每天一次写入磁盘。redis-py库非常易于使用。

于 2013-06-20T16:08:41.487 回答
0

根据我的一般经验,使用以日期时间为键的字典更容易。列表列表可能会很快变得非常混乱。

但是,我不确定如何最好地更新字典。可能是我的 Python 生锈了,但在我看来,转储到数据库并回读有点多余,尽管可能只是你的陈述有点不清楚。有什么方法可以转储到程序内部的变量中?

如果不是,我认为转储到 DB 并回读可能是您唯一的选择……但同样,我的 Python 有点生疏了。

也就是说,虽然我不想成为Programmaticus Takeitovericus,但我想知道您是否曾经研究过 XML 用于数据存储?我最终换了它,因为我发现它比数据库更容易使用,并且涉及的阅读和写作要少得多。我不知道你的项目规格,所以这个建议对你来说可能毫无意义。

于 2013-06-20T16:09:51.260 回答