eXt*_*eXt 7 python hadoop mongodb pytables pandas
我有一个项目,物理传感器将数据发送到服务器.数据不定期发送 - 在激活传感器后,但不会少于每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
...
Run Code Online (Sandbox Code Playgroud)
预计不会超过每100个请求/秒.数据库中的数据记录应该持续90天,在某些情况下甚至更多(不仅仅是我之前认为的2周).因此,记录总量不会超过120 960 000/14天.这是"安全"的估计.实际上它可能少10倍(10 req /秒,12 960 000条记录).
我需要对数据做一些分析,比如:
上面的"声明时间"大于或等于1秒.
整个服务器部分是在Django(和django-rest-framework来收集数据)中开发的.
问题是如何有效地进行这种数据分析,假设应该有实时或接近实时(1秒)的数据监控和时间段来触发所需的操作.
我的想法:
运行一个进程,该进程每秒查询数据库以查找满足条件和调用特定操作的记录(可能需要1秒以上)
为每种分析类型运行一个单独的进程(eventlet?),然后每1秒查询一次数据库并触发特定的操作.
每个传感器运行一个进程,持续向其订户报告:我在"值2"上的时间超过x秒等.在该传感器的新数据到达后,进程将被重置.像zeromq这样的一些发布 - 订阅解决方案可能会在这里使用吗?
使用其他/更快的解决方案
提示?
更新.
目前对我来说似乎简单有效的解决方案是:
这将要求我每次请求到达特定传感器时都要进行测试,但另一方面我只需每1秒扫描一次"测试"表.
更新2
我发现了PyTables(http://www.pytables.org/moin/PyTables),它看起来非常适合我作为数据存储的用例.
我的第一个尝试是在“传感器数据表”上创建一个多列索引,例如:
sensor->timestamp->value1 //Index 1
sensor->timestamp->value2 //Index 2
sensor->timestamp->value3 //Index 3
sensor->timestamp->value4 //Index 4
Run Code Online (Sandbox Code Playgroud)
查看您的 SQL 查询是否足够快。您可以通过 eventlet 或 cron 查询它。从性能角度来看,只要该查询足够快,使用哪个并不重要,它很可能成为您的瓶颈。
另一个建议是尝试 MySQL 内存表,或 postgre 等效项(PostgreSQL 中的内存表)。
另一个建议是尝试 Redis。您可以将“传感器数据”存储为排序集的集合;每个传感器 ID 和值字段一个排序集,并按时间戳对数据进行排序。
ZADD sensor_id:value1 timestamp value
ZADD sensor_id:value2 timestamp value
Run Code Online (Sandbox Code Playgroud)
Redis 需要一些应用程序逻辑来累积数据,但如果所有数据都适合 RAM,那么速度会非常快。
回复:MongoDB。你可以获得良好的性能。只要你的可查询数据+索引可以容纳在RAM中并且没有太多的写锁。尽管运行两个提供重叠功能的重量级数据库是一种管理(和编码)负担。鉴于此,压缩并不是真正的问题。您可以在传感器数据上创建 TTL 索引,mongo 将删除 bg 线程中的旧数据。一段时间后文件大小将保持不变。
希望这可以帮助
归档时间: |
|
查看次数: |
1457 次 |
最近记录: |