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

Fast memory allocation for real time data acquisition

本文关键字:内存 分配 实时 数据采集 用于      更新时间:2023-10-16

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

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

缓冲样品的明智方法是什么?在某些现实设置下,采集可以很容易地收集每秒几兆字节。此外,如果内存分配速度很快,但在写入时需要交换,则分页可能至关重要。

我可以想到一种线程化方法,其中单独的线程分配和管理(锁定的,因此不可交换的)内存块池。鉴于总是有足够的这些块预先分配,进一步的分配只会阻止(以防其他进程的页面必须之前被换出)这个内存池的线程,并且获取可以不间断地进行。

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

  • 它应该只依赖于便携式功能,如POSIX。Qt的宇宙也很好。
  • 传感器可以通过各种方式连接。知识产权是一种可能性。通常,传感器通过本地链接(RS232,USB,扩展卡等)直接连接到PC。也就是说,足够快。
  • 时间戳主要由采集硬件本身应用(如果有能力),以避免网络等抖动。

仔细想想

我真的应该担心吗?显然,问题分为三种情况:

  1. 收集的数据很少。它可以很容易地缓冲在一个大的预分配缓冲区中。
  2. 数据收集缓慢。动态分配缓冲区是完全可以的。
  3. 在高采样率下采集的数据如此之多。那么分配就不是问题了,因为缓冲区最终还是会溢出。问题在于如何足够快地将数据从内存缓冲区传输到永久存储。

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

将问题分为 2 个或更多进程,具体取决于您需要对数据执行的操作:

  • 收购
  • 分析器(如果要实时处理数据)
  • 作家

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

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

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