【问题标题】:How to store and compress data for real time data logging?如何存储和压缩数据以进行实时数据记录?
【发布时间】:2010-11-26 00:04:42
【问题描述】:
在开发实时记录输入信号(数字)的软件时,如何最好地存储和压缩这些数据? SQL 引擎会对此有好处,允许未来进行快速数据挖掘,还是有其他适合或压缩到足以每秒处理多达 1000 个数据样本的数据格式?
我不介意在 VC++ 中构建,但适用于 C# 的想法将是理想的。
【问题讨论】:
标签:
database
input
signals
real-time
【解决方案1】:
很难说没有更多信息,例如来源是什么,您是否需要查询存储的数据等等。
但是对于 1000 个样本/秒,您应该考虑在内存中保存几秒钟的数据,然后将它们批量写入另一个线程的持久存储中。 (推荐使用多处理器机器)。
如果您决定通过托管语言执行此操作,请保留相同的数据结构以保存样本 - 这样 GC 就不需要太频繁地收集内存。通过使用指针和 unsafe 关键字(提供对内存结构的直接访问并消除数组的边界检查代码),您可以获得稍微更好的性能。
我不知道你收集每个样本需要多少 CPU 时间;以及在指定时间读取每个样本的时间紧迫性(它们会在您正在读取的设备中缓冲吗?)。如果采样是时间关键的,则每个样本有 1 毫秒;然后你可能无法承受垃圾收集器启动的风险,因为它会阻塞你的线程一段时间。在这种情况下,我会选择非托管方法。
SQL Server 可以轻松保存您的数据,或者您可以将它们写入文件。这主要取决于您以后需要对数据做什么。我不知道每个样本有多少数据,但我们假设它是 8 个字节。然后你每秒有 8000 字节来写入原始数据——也许你有一些开销,所以它可能是 10 kB/s。我能想到的大多数存储机制都能够以这种速度写入数据。只需确保写在另一个线程上,而不是在进行采样的线程上。
【解决方案2】:
您可能希望查看时间序列数据库,而不是关系数据库。这些将被优化以处理您正在考虑的数据类型和使用情况。
Kx 是一个受欢迎的选择,Fame 也是如此。