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

4
我有一系列传感器连接到PC上,测量各种物理参数,如力、旋转速度和温度。这些传感器以某个采样率连续产生样本。一个样本由时间戳和测量的维度本身组成;采样率在单位千赫兹的数量级之间(即每秒1到9000个样本之间)。
PC应该在一定的时间内读取并存储这些样本。之后,收集的数据将进一步处理和评估。
什么是缓冲样本的明智方式?在某些实际设置中,采集很容易每秒收集几兆字节的数据。此外,在写入时可能需要交换页面,如果内存分配快速但需要交换,则可能会出现问题。
我可以想到一种线程方法,其中一个单独的线程分配和管理一组(锁定,因此不可交换)内存块。假设总是预先分配足够多的这些块,进一步分配将只会阻塞(如果其他进程的页面必须在之前交换出去)此内存池的线程,并且采集可以在没有中断的情况下进行。
这基本上是一个概念性问题。然而,为了更具体:
- 它应该仅依赖于可移植功能,如POSIX。Qt的功能也可以。 - 传感器可以以各种方式进行接口。IP是一种可能性。通常,传感器通过本地链接(RS232、USB、扩展卡等)直接连接到PC上。也就是说,足够快。 - 时间戳大多由采集硬件本身应用,以避免网络抖动等。
思考一下
我真的需要担心吗?显然,问题分为三个方案:
1.根本没有收集到多少数据。它可以轻松地缓冲在一个大的预先分配的缓冲区中。
2.数据被慢慢地收集。即时分配缓冲区也完全没问题。
3.高采样率下收集了很多数据。然后,分配不是问题,因为缓冲区最终会溢出。问题在于如何将数据从内存缓冲区快速传输到永久存储器。

7
看一下环形缓冲区。它们通常用于实时数据缓冲。 - jaggedSpire
传感器接口是什么?IP/网络?时间戳是在传感器上应用还是在传输到计算机后应用? - Martin James
2
一次性分配缓冲区并重复使用它们。内存的分配与释放是性能关键系统中常见的瓶颈。 - Thomas Matthews
2
每秒几兆字节根本算不了什么。在你担心如何有效地分配内存之前,你应该先担心如何有效地将数据转储到磁盘上。如果你没有遇到任何磁盘问题,内存应该是你最不用担心的事情。 - n0rd
1
如果你可以将所有数据保存在内存中(即它是一个相对较短的测量),那么只需预先分配所需的所有内存,以任何你感觉舒适的方式,并忘记它。 - n0rd
显示剩余3条评论
1个回答

1
解决这类问题的思路可以如下:
将问题分成两个或多个进程,具体取决于您要对数据执行什么操作:
- 获取器 - 分析器(如果您想实时处理数据) - 编写器
将数据存储在共享内存中的循环缓冲区中(建议使用 boost::interprocess)。
获取器将不断从设备中读取数据并将其存储在共享内存中。同时,一旦已经读取足够的数据进行任何分析,分析器将开始处理它。如果需要,它可以将结果存储到另一个循环缓冲区共享内存中。同时,读取器将从共享内存中读取数据(已获取或已处理)并将其存储在输出文件中。
您需要确保所有进程都正确同步,以便它们同时执行任务,并且不会丢失数据(在数据被处理或保存到输出文件之前没有被覆盖)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接