Führt die .pipe () einen memcpy in node.js aus?

8

Dies ist eine konzeptionelle Abfrage bezüglich der Optimierung auf Systemebene. Mein Verständnis durch das Lesen der NodeJS-Dokumentation ist, dass Pipes praktisch sind, um die Flusskontrolle in Streams durchzuführen.

Hintergrund: Ich habe einen Mikrophon-Stream, der hereinkommt, und ich wollte einen zusätzlichen Kopiervorgang vermeiden, um MIPS des Gesamtsystems zu erhalten. Ich verstehe, dass dies für Audiostreams nicht sehr viel MIPS ist, selbst wenn es eine Memcopy unter der Haube gab, aber ich habe auch eine Erweiterung geplant, um in Kamerarahmen mit 30 fps und UHD-Auflösung zu streamen. Das Erstellen mehrerer Kopien von Pixeldaten mit UHD-Auflösung mit 30 Bildern pro Sekunde ist sehr ineffizient, daher brauchten wir einige Ratschläge.

Beispielcode:

%Vor%

Hier sind die Fragen:

  1. Um eine Flusskontrolle durchführen zu können, führt die source.pipe (dest) ein Memcpy vom Quellspeicher zum Zielspeicher unter der Haube ODER würde sie die Referenz im Speicher an das Ziel weitergeben?
  2. Der kommentierte Code enthält eine Instanziierung der PassThrough-Klasse - ich gehe derzeit davon aus, dass PassThrough auch Memcopies verursacht, und deshalb speichere ich eine Memcpy-Operation im gesamten System, weil ich die obigen Kommentare hinzugefügt habe?
  3. Wenn ich eine Pipe zwischen einem Prozess und einem erzeugten Child-Prozess erstellen müsste (mit child_process.spawn () wie in Wie übertragen / streamen große Daten von / zu untergeordneten Prozessen in node.js, ohne das blockierende stdio zu verwenden? ), nehme ich an, dass definitiv memcpy resultiert? Gibt es überhaupt eine Referenz, anstatt zu kopieren?
  4. Unterscheidet sich dieses Verhalten von Betriebssystem zu Betriebssystem? Ich nehme an, es sollte OS-agnostisch sein, aber frag es trotzdem.

Vielen Dank im Voraus für Ihre Hilfe. Es wird meiner Architektur sehr helfen.

    
Ashish 31.01.2016, 06:06
quelle

1 Antwort

4

einige URLs als Referenz: Ссылка
Ссылка
Ссылка
Ссылка
Ссылка

Ich habe versucht, eine komplizierte / riesige Erklärung basierend auf diesen und einigen anderen Dateien zu schreiben, aber ich kam zu dem Schluss, dass es am besten wäre, Ihnen eine Zusammenfassung zu geben, wie meine Erfahrung / Lesung mir sagt, dass Knoten intern funktioniert:

pipe verbindet einfach die Streams, so dass es so aussieht, als ob .on("data", …) von .write(…) aufgerufen wird, ohne dazwischen etwas aufgebläht zu sein.

Jetzt müssen wir die js-Welt von der c ++ / c-Welt trennen.
Beim Umgang mit Daten in js verwenden wir Puffer. Ссылка
Sie stellen einfach den zugewiesenen Speicher mit etwas Süßigkeit dar, um damit zu arbeiten.

Wenn Sie stdout eines Prozesses mit einem .on("data", …) Listener verbinden, wird der eingehende Chunk in ein Buffer-Objekt zur weiteren Verwendung innerhalb der js-Welt kopiert.
Innerhalb der js-Welt haben Sie Methoden wie .pause() usw. (wie Sie in den Dampf-API-Dokumentationen von Knoten sehen können), um zu verhindern, dass der Prozess Speicher verbraucht, falls eingehende Daten schneller fließen als verarbeitet.

Das Verbinden von stdout eines Prozesses und beispielsweise eines ausgehenden tcp-Ports durch eine Pipe führt zu einer ähnlichen Verbindung wie nginx. es verbindet diese Ströme, als würden sie direkt miteinander kommunizieren, indem sie eingehende Daten direkt in den ausgehenden Datenstrom kopieren.

Sobald Sie einen Stream pausieren, verwendet der Knoten die interne Pufferung, falls er den eingehenden Stream nicht pausieren kann.

Also solltest du für dein Szenario einfach testen.
Versuchen Sie, Daten über einen eingehenden Stream im Knoten zu empfangen, unterbrechen Sie den Stream und sehen Sie, was passiert.
Ich bin mir nicht sicher, ob der Knoten die interne Pufferung verwendet oder ob der Prozess, den Sie ausführen möchten, so lange angehalten wird, bis er weiterhin Daten senden kann.
Ich erwarte, dass der Prozess angehalten wird, bis Sie den Stream fortsetzen.

Für die Übertragung großer Bilder empfehle ich, sie in Chunks zu übertragen oder sie direkt an einen ausgehenden Port zu leiten.

Mit der Chunk-Methode können Sie die Daten gleichzeitig an mehrere Clients senden und den Speicherbedarf gering halten.

PS: Sieh dir diesen Punkt an, den ich gerade gefunden habe: Ссылка es erklärt ausführlich, wie Sie mit Streams interagieren können

    
GottZ 03.02.2016, 13:31
quelle

Tags und Links