【发布时间】:2016-12-19 07:11:06
【问题描述】:
在Linux上将大数据(RGB图像数据:320 * 240 * 3)从c ++进程发送到python进程(以及从python到c ++的小尺寸浮点数据)的足够快的方式是什么(大约40〜50Hz) ?注意:这两个进程在同一台PC上运行。
我试过了:
- UDP
- 共享内存
对于 UDP:
要发送的消息大于 UDP 消息约束(65535),所以直接使用sendto() 会报错:Message too long。而且我也怀疑这是否是一种快速的方式(大约40~50Hz就可以了)。
对于共享内存:
共享内存似乎是将图像从 c++ 发送到 c++ 的一种快速方法。但是由于python中没有指针,所以我没有找到在共享内存中读写数据的方法。
那么有没有一种快速的方法来做上面的 IPC 事情?或者也许是在 python 中读取和写入 unsigned char 和 float 类型值到共享内存的好方法?
【问题讨论】:
-
您不会一次发送所有数据。你分块发送。假设您有 5 GB 的数据要发送。您不会一次发送 5 GB 的数据,反正毫无意义。此外,如果您的数据很重要并且您不能丢失任何数据,那么请使用 TCP 而不是 UDP。
-
赫兹不是吞吐量单位。你的意思是你想通过 IPC 发送 320*240*3 字节的数据,每秒 50 次,(10.98 MiBps 左右)?
-
@MichaelFoukarakis 是的,我想每秒发送大约 40~50 次无符号字符类型 320*240*3 的数据。
-
大约 10 MBytes/s。您可以制作一个 RAMdisk 并将 C++ 程序中的帧作为文件写入其中,然后在 Python 中打开文件并读取它们。 RAMdisk 的大小将允许 C++ 程序领先一点,或者 Python 落后一点——即缓冲区速度变化。 jamescoyle.net/how-to/943-create-a-ram-disk-in-linux 即使是 512MB 的小 RAM 磁盘也可以让您缓冲 50 秒。
-
@MarkSetchell:因为磁盘实际上并没有被使用。该文件在刷新之前被覆盖。通常,Linux 会在 30 秒后刷新 没有数据变得足够老以访问磁盘,甚至关闭。这里的预期寿命是 20-25 毫秒秒