7

我正在构建一个数据采集系统。采集的数据通常由 15 个信号组成,每个信号以(比如说)500 Hz 的频率进行采样。也就是说,每秒大约 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 上运行。

4

3 回答 3

4

你可以看看使用HDF5 ...它是为流数据设计的,允许时间索引搜索并且(据我所知)在 Python 中得到很好的支持

于 2012-10-30T18:52:37.963 回答
2

使用您描述的键,您应该能够在必要时通过分片进行扩展。120kB / 30sec 不算多,所以我认为你不需要太早分片。

如果将其与仅使用文件进行比较,您将获得更复杂的查询并内置复制以实现高可用性、DS 或离线处理(Map Reduce 等)。

于 2012-10-30T16:33:53.113 回答
-1

在您的情况下,您可以只创建 15 个文件并将每个样本按顺序保存到相应的文件中。这将确保请求的样本连续存储在磁盘上,从而减少读取时的磁盘寻道次数。

于 2012-10-27T17:02:39.770 回答