2016-12-19 1 views
0

Was ist der schnell genug Weg (ca. 40 ~ 50Hz), um große Daten (RGB-Bilddaten: 320 * 240 * 3) von C++ - Prozess zu Python-Prozess (und kleine Größe von Float-Daten von Python zu C++) unter Linux zu senden? Hinweis: Die beiden Prozesse laufen auf demselben PC.Wie kann man unter Linux große Datenmengen von C++ an Python senden?

I haben versucht:

  1. UDP
  2. Shared Memory

Für UDP:
die Nachricht gesendet werden soll, größer ist als die UDP-Nachricht constrain (65535), so direkt mit sendto() wird Fehler erhalten: Nachricht zu lang. Und ich bezweifle auch, ob es ein schneller Weg ist (ca. 40 ~ 50Hz ist in Ordnung).

Für Shared Memory:
Shared Memory scheint eine schnelle Art und Weise zu sein Bild von c zu senden ++ C++. Aber da es in Python keinen Zeiger gibt, finde ich keine Möglichkeit, Daten im Shared Memory zu lesen und zu schreiben.

Also gibt es eine schnelle Möglichkeit, IPC Dinge oben zu tun? Oder vielleicht eine gute Möglichkeit zu lesen und zu schreiben unsigned char und Float Typ Werte auf gemeinsam genutzten Speicher in Python?

+0

Sie senden nicht alle Daten auf einmal. Sie senden es in Stücke. Nehmen wir an, Sie haben 5 GB Daten zum Senden. Sie senden die 5 GB Daten nicht auf einmal, viel sinnlos sowieso. Auch wenn Ihre Daten wichtig sind und Sie nichts davon verlieren können, dann gehen Sie mit TCP statt UDP. – Bauss

+0

Hertz ist keine Einheit des Durchsatzes. Meinst du, du willst 320 * 240 * 3 Oktette Daten senden, 50 mal pro Sekunde (10,98 MiBps oder so) über IPC? –

+0

@MichaelFouarakis Ja, ich möchte unsigned char Typ 320 * 240 * 3 Daten über 40 ~ 50 Mal pro Sekunde senden. –

Antwort

-1

Unter Linux könnten Sie Pipes versuchen. Ein Programm wird in die Pipe-Datei "schreiben", während das andere Programm es "liest". In diesem Fall schreibt das C-Programm das Array von Image-Bytes in die Pipe und das Python-Programm liest den Byte-Stream.
Sie müssen eine clevere Möglichkeit finden, ein Trennzeichen zwischen den Rahmen zu haben, wenn die Rahmengröße nicht im Voraus bekannt ist.

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

Andernfalls würde ein TCP-Socket ausreicht. Aber seien Sie vorsichtig - es kann viel schief gehen, wenn Sie nicht auf die Rückgabewerte aller Funktionen achten oder Annahmen über die Nachrichtenlänge treffen.

2

mmap die gleiche Datei in beiden Anwendungen, und verwenden Sie dann eine domain socket, um die Verwendung des mmapped Space zu koordinieren.

+0

Bedeutet das, ich muss zuerst die Frames auf der Festplatte speichern und dann mmap wie mmap (fileno, len) in Python verwenden? Ich habe mmap vorher noch nicht verwendet, daher mag der Kommentar seltsam sein :-) –

+0

Nein, erstellen Sie einfach eine leere Datei der passenden Größe und formatieren Sie sie in C++ und Python. Sie können es dann als byteweisen Speicherbereich behandeln. –

+0

Aber diese beiden Prozesse werden wahrscheinlich tagelang interagieren, deshalb kann ich die Frames nicht in einer Datei speichern, da sie immer größer wird. –

-1

können Sie beide Anwendungen Speicher mit Tools wie swig kombinieren.

können Sie auch namedpipe verwenden

Verwandte Themen