2016-12-19 5 views
0

Linux上で、C++プロセスからPythonプロセス(およびPythonからC++への小さなサイズのフロートデータ)に大きなデータ(RGBイメージデータ:320 * 240 * 3)を送信するのに十分な高速(約40〜50Hz)は何ですか?注:2つのプロセスは同じPCで実行されています。LARGEデータをC++からPythonにLinux上で高速に送る方法は?

私が試みた:

  1. UDP
  2. 共有メモリ

をUDPの場合:
送信されるメッセージは、そうUDPメッセージ制約(65535)よりも大きいです直接sendto()を使用するとエラーが発生します:メッセージが長すぎます。そして、私はそれが速い方法であるかどうかも疑います(約40〜50Hzは大丈夫です)。共有メモリについては


共有メモリはC++からのC++に画像を送信するための高速な方法のようです。しかし、Pythonにはポインタがないので、共有メモリにデータを読み書きする方法はありません。

上記のIPCを行うには速い方法がありますか?あるいは、良い方法は、符号なしの文字floatの値をPythonの共有メモリに書き込むことができますか?

+0

すべてのデータを一度に送信するわけではありません。あなたはそれをチャンクで送る。送信するデータが5 GBあるとします。とにかく、5 GBのデータを一度に送るわけではありません。また、あなたのデータが重要で、あなたがそれを失うことができない場合は、UDPの代わりにTCPを使います。 – Bauss

+0

Hertzはスループットの単位ではありません。 IPCで320 * 240 * 3オクテットのデータを50回/秒(10.98 MiBps程度)送りたいのですか? –

+0

@MichaelFoukarakisはい、私は無署名のchar型320 * 240 * 3のデータを毎秒約40〜50回送信します。 –

答えて

-1

Linuxでは、パイプを試すことができます。あるプログラムはパイプファイルに "書き込み"、他のプログラムはパイプファイルを "読み込み"ます。この場合、Cプログラムはイメージバイトの配列をパイプに書き込み、Pythonプログラムはバイトストリームを読み込みます。
フレームサイズがあらかじめ分かっている場合を除いて、フレーム間に区切り文字を付ける巧妙な方法を見つける必要があります。

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

そうでない場合は、TCPソケットは十分であろう。しかし、注意してください - すべての関数からの戻り値に注意を払わない、またはメッセージの長さを前提にしていない場合、ここで間違っていることがたくさんあります。

2

mmap両方のアプリケーションで同じファイルを使用し、次にdomain socketを使用して、mmapped空間の使用を調整します。

+0

これは、最初にフレームをディスクに保存してから、mmap(fileno、len)のようなmmapをpythonで使用する必要があるということですか?私は前にmmapを使用していないので、コメントが奇妙なことがあります:-) –

+0

いいえ、適切なサイズの空のファイルを作成し、C++とPythonの両方でmmapしてください。それで、それをそれぞれのバイト単位のメモリ空間として扱うことができます。 –

+0

しかし、これらの2つのプロセスはおそらく数日間相互作用することがあるため、フレームをファイルに保存することはできません。 –

-1

あなたは両方のアプリケーションメモリをswigのようなツールと組み合わせることができます。

また、名前付きパイプを使用することができます

関連する問題