用于实时数据采集的快速存储器分配

时间:2015-06-17 18:10:18

标签: c++ memory-management

我有一系列传感器连接到PC,可测量各种物理参数,如力,转速和温度。这些传感器以一定的采样率连续生成样品。样本由时间戳和测量的维度本身组成;采样率的大小为一位数千赫兹(即每秒1到9000个样本之间)。

PC应该在给定的时间段内读取和存储这些样本。然后进一步处理和评估收集的数据。

缓冲样品的合理方法是什么?在一些现实的设置中,采集可以轻松地每秒收集几兆字节。如果内存快速分配但需要在写入时进行交换,则分页也很重要。

我可以想到一种线程方法,其中一个单独的线程分配和管理一个(锁定的,不可交换的)内存块池。鉴于预先分配了足够的这些块,进一步的分配只会阻塞(如果之前必须换掉其他进程的页面),这个内存池的线程和获取可以不间断地进行。

这基本上是一个概念性问题。然而,更具体一点:

  • 它应该只依赖便携式功能,如POSIX。 Qt的宇宙特征也很好。
  • 传感器可以通过各种方式连接。 IP是一种可能性。通常,传感器通过本地链路(RS232,USB,扩展卡等)直接连接到PC。那就够了。
  • 如果能够这样做,时间戳主要由采集硬件本身应用,以避免网络抖动等。

思考

我应该真的担心吗?显然,问题转移到三种情况中:

  1. 根本收集的数据很少。它可以很容易地在一个大的预分配缓冲区中进行缓冲。
  2. 慢慢收集数据。动态分配缓冲区非常好。
  3. 以高采样率获取的数据非常多。然后分配不是问题,因为缓冲区最终会溢出。问题在于如何将数据从内存缓冲区快速传输到永久存储器。

1 个答案:

答案 0 :(得分:1)

解决此类问题的想法如下:

根据您对数据的处理,将问题分成两个或多个进程:

  • 收单
  • 分析器(如果您想实时处理数据)
  • 作家

将数据存储在共享内存中的循环缓冲区中(我建议使用boost :: interprocess)。

收件人将不断从设备读取数据并将其存储在共享内存中。与此同时,一旦有足够的数据读取进行任何分析,分析仪将开始处理它。如果需要,它可以将结果存储到另一个循环缓冲区共享内存同时,Reader将从共享内存(已获取或已处理)中读取数据并将其存储在输出文件中。

您需要确保所有进程都正确同步,以便它们同时完成工作,并且不会丢失数据(数据在处理或保存到输出文件之前不会被覆盖)。