如何在 Linux 上快速将 LARGE 数据从 c++ 发送到 python?

Posted

技术标签:

【中文标题】如何在 Linux 上快速将 LARGE 数据从 c++ 发送到 python?【英文标题】:How to send LARGE data from c++ to python in a fast way on Linux? 【发布时间】: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 charfloat 类型值到共享内存的好方法?

【问题讨论】:

您不会一次发送所有数据。你分块发送。假设您有 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 毫秒 【参考方案1】:

mmap 在两个应用程序中使用相同的文件,然后使用domain socket 来协调使用映射空间。

【讨论】:

这是否意味着我必须先将帧保存在磁盘上,然后在 python 中使用 mmap(fileno, len) 之类的 mmap?我以前没用过 mmap,所以评论可能很奇怪 :-) 不,只需创建一个适当大小的空文件并在 C++ 和 Python 中将其映射。然后,您可以将其视为每个字节的内存空间。 但这两个进程可能会交互几天,所以我无法将帧保存到文件中,因为它会不断增长。 处理后真的需要保留旧帧吗? 是的,大约有数百万帧……正在尝试训练神经网络。【参考方案2】:

在 Linux 上,您可以尝试管道。一个程序将“写入”管道文件,而另一个程序将“读取”它。在这种情况下,C 程序会将图像字节数组写入管道,python 程序将读取字节流。 除非事先知道帧大小,否则您必须找到一种巧妙的方法在帧之间设置分隔符。

http://www.python-course.eu/pipes.php

否则,一个 TCP 套接字就足够了。但要小心 - 如果不注意所有函数的返回值或对消息长度做出假设,这里可能会出错。

【讨论】:

【参考方案3】:

您可以将两个应用程序的内存与 swig 等工具结合使用。

你也可以使用命名管道

【讨论】:

以上是关于如何在 Linux 上快速将 LARGE 数据从 c++ 发送到 python?的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数内部获取 JSON 数据并将其快速显示在文本字段上?

在 Linux 系统上快速创建大文件

Linux服务管理(如何关闭或禁用不需要的服务

如何快速掌握大数据知识,按照学习路线来

Linux运维如何快速入门?这三点很重要!

Linux/Centos Mondo 一键部署镜像恢复,快速部署