我正在建立一个数据采集系统。获取的数据通常由15个信号组成,每个信号以(例如)500Hz采样。也就是说,每秒约15 x 500 x 4字节(有符号浮点数)将到达并且必须保持不变。
以前的版本是在.NET(C#)上构建的,使用DB4O db进行数据存储。这非常有效并且表现良好。
新版本将基于Linux,使用Python(或Erlang)和......是的!什么是合适的存储候选者?
我在想MongoDB,将每个样本(或实际上是一堆样本)存储为BSON对象。每个样本(块)都有一个样本计数器作为密钥(索引)字段,以及信号源标识。
问题是,我必须能够很快地检索样本。根据要求,使用样本计数器范围和请求的信号源,必须在不到一秒的时间内检索多达30秒的数据。当前(C#/ DB4O)版本管理这个OK,在不到100毫秒的时间内检索数据。
我知道Python在性能方面可能并不理想,但我们稍后会看到它。
系统(“服务器”)将连接多个采集客户端,因此架构必须很好地扩展。
编辑: 经过进一步研究后,我可能会使用HDF5获取样本数据,使用Couch或Mongo获取更多类似文档的信息。我会告诉你。
编辑: 最终解决方案基于HDF5和CouchDB。它表现得很好,用Python实现,在Raspberry Pi上运行。
答案 0 :(得分:4)
您可以查看使用HDF5 ...它是专为流数据设计的,允许时间索引搜索和(据我所知)在Python中得到很好的支持
答案 1 :(得分:2)
使用您描述的按键,如果需要,您应该能够通过分片进行缩放。 120kB / 30秒不是那么多,所以我认为你不需要太早碎片。
如果将其与仅使用文件进行比较,您将获得更复杂的查询并构建复制以实现高可用性,DS或离线处理(Map Reduce等)。
答案 2 :(得分:-1)
在您的情况下,您可以创建15个文件并将每个样本按顺序保存到相应的文件中。这将确保所请求的样本连续存储在磁盘上,从而减少读取时的磁盘搜索次数。