Python“内存数据库样式”数据类型

时间:2013-06-20 16:00:24

标签: python types raspberry-pi

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

我有一个python程序,它可以监视风速计的GPIO引脚并计算脉冲来计算风速。它还通过ADC读取风向标过程以获得方向。对于其他传感器,我每隔几分钟只处理它们并将数据直接转储到数据库。因为我必须从风传感器数据中计算很多东西,所以我不一定要每隔5秒写入数据库,然后必须回读过去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.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')}

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

3 个答案:

答案 0 :(得分:1)

Python程序和数据库之间有多个缓存层。特别是,Linux磁盘块缓存可能会根据使用模式将您的数据库保持在核心状态。因此,您不应该假设写入数据库并回读必须比您在应用程序中放置的某些自制缓存更慢。你编写的过早优化数据库的代码将比你不编写的代码更加错误。

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

答案 1 :(得分:0)

一种选择是使用redis来存储您的数据。它是一个关键的价值存储,非常适合存储您正在谈论的数据。它在内存中运行并将数据写入磁盘以保持持久性,这是configurable所以你可以让它每隔几小时或每天一次写入磁盘。 redis-py库非常易于使用。

答案 2 :(得分:0)

根据我的一般经验,使用由datetime键入的字典更容易。列表清单很快就会变得非常混乱。

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

如果没有,我认为转储到数据库并回读可能是你唯一的选择......但同样,我的Python有点生疏。

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