使用Python进行基于时间的数据分析

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. 当新记录出现并且"值2"为真时执行某些操作
  2. 当传感器X的"值2"为真时间超过某些声明的时间(50分钟,1小时或更长时间)时执行某些操作
  3. 当传感器X在24小时内的"值2"的总真实时间超过某些声明的时间时,做一些事情
  4. 当传感器X的"值3"为真的时间比某些声明的时间更长并且在此期间没有其他类型的XYZ传感器处于活动状态时执行某些操作...

上面的"声明时间"大于或等于1秒.

整个服务器部分是在Django(和django-rest-framework来收集数据)中开发的.

问题是如何有效地进行这种数据分析,假设应该有实时或接近实时(1秒)的数据监控和时间段来触发所需的操作.

我的想法:

  1. 运行一个进程,该进程每秒查询数据库以查找满足条件和调用特定操作的记录(可能需要1秒以上)

  2. 为每种分析类型运行一个单独的进程(eventlet?),然后每1秒查询一次数据库并触发特定的操作.

  3. 每个传感器运行一个进程,持续向其订户报告:我在"值2"上的时间超过x秒等.在该传感器的新数据到达后,进程将被重置.像zeromq这样的一些发布 - 订阅解决方案可能会在这里使用吗?

  4. 使用其他/更快的解决方案

    • Mongodb - 问题可能是在移除数据(2周)后mongodb的文件没有被压缩.
    • Hadoop - 对于这类问题,它不是太大而且太复杂吗?
    • Pandas和一些HDF5存储 - 问题可能在于它是否能够进行我上面描述的分析,也可能是写入文件.但是......也许可以和mongo一起工作.

提示?

更新.

目前对我来说似乎简单有效的解决方案是:

  1. 数据到达传感器A后运行所有测试和
  2. 将测试结果存储在一些"测试"表(或redis)中,其方式如下:
    • 今天下午1:15运行动作"传感器打开时间超过"
    • 今天下午1:30运行"传感器打开时间超过24小时"...
  3. 连续扫描上面的"测试"表,当今天下午1:15,然后运行所需的操作等.
  4. 当新信号到达传感器A然后再次运行所有测试时,还会在"测试"表中重置数据.

这将要求我每次请求到达特定传感器时都要进行测试,但另一方面我只需每1秒扫描一次"测试"表.

更新2

我发现了PyTables(http://www.pytables.org/moin/PyTables),它看起来非常适合我作为数据存储的用例.

Adi*_*dil 2

我的第一个尝试是在“传感器数据表”上创建一个多列索引,例如:

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 线程中的旧数据。一段时间后文件大小将保持不变。

希望这可以帮助