用于实时数据采集的快速内存分配
Fast memory allocation for real time data acquisition
我有一系列传感器连接到PC上,用于测量各种物理参数,如力,转速和温度。这些传感器以一定的采样率连续产生样品。样本由时间戳和测量维度本身组成;采样率的幅度为个位数千赫兹(即每秒 1 到 9000 个样本之间)。
PC应该在给定的时间段内读取和存储这些样本。之后,对收集的数据进行进一步处理和评估。
缓冲样品的明智方法是什么?在某些现实设置下,采集可以很容易地收集每秒几兆字节。此外,如果内存分配速度很快,但在写入时需要交换,则分页可能至关重要。
我可以想到一种线程化方法,其中单独的线程分配和管理(锁定的,因此不可交换的)内存块池。鉴于总是有足够的这些块预先分配,进一步的分配只会阻止(以防其他进程的页面必须之前被换出)这个内存池的线程,并且获取可以不间断地进行。
这基本上是一个概念性问题。然而,更具体地说:
- 它应该只依赖于便携式功能,如POSIX。Qt的宇宙也很好。
- 传感器可以通过各种方式连接。知识产权是一种可能性。通常,传感器通过本地链接(RS232,USB,扩展卡等)直接连接到PC。也就是说,足够快。
- 时间戳主要由采集硬件本身应用(如果有能力),以避免网络等抖动。
仔细想想
我真的应该担心吗?显然,问题分为三种情况:
- 收集的数据很少。它可以很容易地缓冲在一个大的预分配缓冲区中。
- 数据收集缓慢。动态分配缓冲区是完全可以的。
- 在高采样率下采集的数据如此之多。那么分配就不是问题了,因为缓冲区最终还是会溢出。问题在于如何足够快地将数据从内存缓冲区传输到永久存储。
解决此类问题的想法可以如下:
将问题分为 2 个或更多进程,具体取决于您需要对数据执行的操作:
- 收购
- 分析器(如果要实时处理数据)
- 作家
将数据存储在共享内存中的循环缓冲区中(我建议使用 boost::interprocess)。
收单行将持续从设备读取数据并将其存储在共享内存中。同时,一旦读取的数据足以进行任何分析,分析器将开始处理它。如果需要,它可以将结果存储到另一个循环缓冲区共享内存中。同时,Reader 将从共享内存(已获取或已处理)读取数据并将其存储在输出文件中。
您需要确保所有进程都正确同步,以便它们同时完成工作并且不会丢失数据(在处理数据或保存到输出文件之前不会覆盖数据)。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配