我有一系列连接到 PC 的传感器,用于测量各种物理参数,例如力、转速和温度。这些传感器以一定的采样率连续生成样本。样本由时间戳和测量维度本身组成;采样率的数量级为个位数千赫兹(即,介于每秒 1 到 9000 个样本之间)。
PC 应该在给定的时间段内读取并存储这些样本。之后,收集的数据将得到进一步处理和评估。
缓冲样本的明智方法是什么?在一些实际的设置中,采集可以很容易地每秒收集几兆字节。如果内存分配速度很快但需要在写入时交换,分页也可能很关键。
我可以想到一种线程方法,其中一个单独的线程分配和管理一个池(锁定,因此不可交换)内存块。假设总是有足够的这些 block 被预先分配,进一步的分配只会阻塞(如果其他进程的页面之前必须换出)这个内存池的线程和获取可以不间断地进行。
这基本上是一个概念性问题。然而,更具体地说:
- 它应该只依赖可移植的特性,比如 POSIX。 Qt 世界的功能也很好。
- 传感器可以通过多种方式连接。 IP是一种可能性。通常传感器通过本地链路(RS232、USB、扩展卡等)直接连接到 PC。也就是说,足够快。
- 时间戳主要由采集硬件本身应用(如果它能够这样做),以避免网络抖动等。
考虑一下
我真的应该担心吗?显然,问题分为三种情况:
- 收集的数据很少。它可以很容易地缓冲在一个大的预分配缓冲区中。
- 数据收集缓慢。动态分配缓冲区非常好。
- 以高采样率采集了如此多的数据。那么分配就不是问题了,因为缓冲区最终还是会溢出。问题在于如何足够快地将数据从内存缓冲区传输到永久存储。
最佳答案
解决这类问题的思路可以如下:
根据您需要对数据执行的操作,将问题分成 2 个或更多进程:
- 收购方
- 分析器(如果你想实时处理数据)
- 作家
将数据存储在共享内存的循环缓冲区中(我推荐使用 boost::interprocess)。
Acquirer 会不断地从设备中读取数据并将其存储在共享内存中。同时,一旦读取了足够的数据来进行任何分析,分析器就会开始处理它。如果需要,它可以将结果存储到另一个循环缓冲区共享内存中。与此同时,Reader 将从共享内存中读取数据(已获取或已处理)并将其存储在输出文件中。
您需要确保所有进程都正确同步,以便它们同时完成工作并且您不会丢失数据(数据在处理或保存到输出文件之前不会被覆盖)。
关于c++ - 用于实时数据采集的快速内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30899159/