我有个项目让物理传感器把数据发送到服务器。数据的发送是不规则的--在某些东西激活传感器之后,但不少于每20分钟发送一次。服务器上的数据存储在Posgresql数据库中。
数据结构如下所示:
Sensor Table
sensor name - string
sensor serial no - string
sensor type - foreign key to types table
Sensor Data Table
sensor - foreign key
timestamp
value 1 - boolean
value 2 - boolean
value 3 - integer
value 4 - float
...预计总请求不会超过100次/秒。数据库中的数据记录应该持久化90天,在某些情况下甚至更长(而不是像我之前想的那样只有2周)。因此,记录的总数将不超过120 960 000/14天。这是“安全”的估计。实际上,它可能会少10倍(10雷克/秒,12 960 000条记录)。
我需要对数据做一些分析,比如:
上面的“声明时间”大于或等于1秒。
整个服务器部分是用Django (和django-rest-框架来收集数据)开发的。
问题是如何有效地进行这种数据分析,假设应该对数据和时间段进行实时或接近实时(1秒)的监测,以触发所需的行动。
我的想法:
- Mongodb - the problem might be that mongodb's files are not compacted after data is removed (2 weeks).
- Hadoop - isn't it too big and too complex for this class of problems?
- Pandas and some HDF5 storage - the problem might be whether it's capable of doing the analysis I've described above and probably also with writes into files. But.. might work with mongo too.
暗示?
更新。
目前,我认为简单有效的解决办法是:
这将要求我在每次请求到达特定传感器时启动测试,但另一方面,我必须每1秒扫描一次“测试”表。
更新2
我发现了PyTables (http://www.pytables.org/moin/PyTables),看起来它非常适合我的用例作为数据存储。
发布于 2013-04-15 14:00:06
我的第一个尝试是在“传感器数据表”上创建一个多列索引,如下所示:
sensor->timestamp->value1 //Index 1
sensor->timestamp->value2 //Index 2
sensor->timestamp->value3 //Index 3
sensor->timestamp->value4 //Index 4查看SQL查询是否足够快。您可以通过eventlets或cron查询它。从性能角度看,使用哪种查询并不重要,只要这个查询足够快,它很可能是您的瓶颈。
另一个建议是尝试MySQL内存表或postgre等效项(In-memory table in PostgreSQL)。
另一个建议是试试Redis。您可以将“传感器数据”存储为排序集的集合;每个传感器id和值字段有一个排序集,并按时间戳对数据进行排序。
ZADD sensor_id:value1 timestamp value
ZADD sensor_id:value2 timestamp valueRedis将需要一些应用程序逻辑来积累数据,但是如果它们都适合于RAM,它将非常快。
Re: MongoDB.你可以得到好的待遇。只要您的可查询数据+索引可以安装在RAM中,并且没有太多的写锁。尽管运行两个提供重叠特性的重量级数据库是一个管理(和编码)负担。因此,压缩并不是一个真正的问题。您可以在传感器数据上创建TTL索引,mongo将删除bg线程中的旧数据。文件大小在一段时间后将保持不变。
希望这能有所帮助
发布于 2013-04-15 15:23:58
如果您的规则很简单或很少,您可以尝试使用SQL触发器来更新存储的视图,这可能很快就会被查询。例如,假设您想要检测,某个传感器已经激活了给定的时间,您可以有一个包含当前活动传感器激活时间的表。无论何时存储原始事件,触发器都会更新这样的表。
对于第3类型的规则来说,这将更加困难。除非有几个规则,并且您可以为每个规则设置一组触发器和视图,或者预先知道允许的时间段。
发布于 2013-04-15 19:40:36
选项4.关系数据库是明显的瓶颈。以更简单的形式安排数据传递(目录中的文件,由传感器名称或其他唯一键命名)。您可以更快地处理,检查时间戳和阅读,然后在分析之后将数据推送到后端的rdb。
https://stackoverflow.com/questions/16014246
复制相似问题