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

标签 c++ memory-management

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

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

缓冲样本的明智方法是什么?在一些实际的设置中,采集可以很容易地每秒收集几兆字节。如果内存分配速度很快但需要在写入时交换,分页也可能很关键。

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

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

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

考虑一下

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

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

最佳答案

解决这类问题的思路可以如下:

根据您需要对数据执行的操作,将问题分成 2 个或更多进程:

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

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

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

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

关于c++ - 用于实时数据采集的快速内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30899159/

相关文章:

c++ - 我应该多认真对待 Valgrind 和小内存泄漏(比方说 < 100 字节)?

c++ - 从 C++ 中的 CSV 文件中读取特定元素

c++ - 编译共享库linux gcc/g++ cpp

c++ - 当程序集中的 operator delete() 删除 vptr 指针时?

Java:为什么它使用固定数量的内存?或者它如何管理内存?

c# - 在 C# 中使用大量 COM 对象的内存使用过多

ios - 将 NSMutableArray 的内容保存到文件

c++ - 为什么允许此举?

c++ - 关于 const 禁止的重言式比较的警告?

android - 为什么Android在加载图像时分配的内存比需要的多