2009-03-04 11 views
5

Ich arbeite an einigen Java < -> Perl-Interaktion. Ich würde gerne wissen, was der beste Weg ist, Informationen von Perl an Java weiterzugeben. (Große Antworten über Perl und Java here und here BTW).Wie kann ich Daten von Perl an Java übergeben?

Es gibt eine Menge Text und XML (XML :: Twig) Ich parsiere in Perl, in einem Skript, das ich von einer Java Web App aufrufen soll. Also habe ich all diese gesammelten Daten, und ich brauche es, um es in bestimmten Objekten in Java zu verwenden.

Was könnte eine gute Strategie sein, um die Informationen von Perl nach Java zu senden? Ist es überhaupt möglich, ein Objekt oder eine andere kompatible Datenstruktur von Perl nach Java zurückzugeben?

Ich denke, das Schreiben in eine Textdatei und das Lesen von Java würde alle Optimierung durch die Verwendung von Perl bedeutungslos machen.

Performance ist ein wichtiges Thema hier.

EDIT: Von dem, was ich habe here gesehen, vielleicht Inline-Java eine gute Option sein würde?

+0

also versuchen Sie, Ihren alten Java-Code in Perl zu machen? – TStamper

+0

1. versuchen Sie JSON 2. loswerden von Perl, und verwenden Sie nur Java :) –

+0

Ich las durch den Beitrag dieser Frage und es wurde empfohlen, JSON, Inline-Java, offene TCP-Verbindung zu verwenden und Daten und zuletzt direkt zu übertragen Übergeben Sie XML. * Welches ist besser unter den vorgeschlagenen Ansätzen? * Gibt es andere bessere Möglichkeiten, was ist mit Web Services oder anderen Vorschlägen? – Rachel

Antwort

5

Wenn die Leistung wichtig ist, würde ich empfehlen, einen persistenten Perl-Prozess auszuführen. Das Starten eines Perl-Interpreters bei jedem Ausführen des Codes ist ein großer Aufwand.

Der einfachste Weg zu kommunizieren ist, dass der Java-Prozess eine TCP-Verbindung zu den Perl-Prozessen öffnet, Daten schreibt und etwas zurückbekommt.

Das Format, das Sie verwenden, um Daten von Ihrem Perl-Prozess zurück zu Ihrem Java-Prozess zu senden, hängt davon ab, was Sie senden und wie generisch und wiederverwendbar Ihr Code sein soll. Das Zurücksenden von XML-Strings ist nett und generisch, aber das Zurücksenden von Bytearrays, die mit pack in Perl erstellt wurden, und das Lesen von a mit DataInputStream in Java wird viel schneller.

+0

Sie können Inline :: Java auf diese Weise verwenden. Es kann einen jvm-Prozess erstellen, der mit Ihrem Perl-Prozess kommuniziert. Es ist ein benutzerdefiniertes Format oder Kurs, aber Sie können native Java-Objekte in Perl verwenden und umgekehrt – mpeters

2

Wenn Sie XML bereits haben, ist es wahrscheinlich die beste Option, sie weiterhin zu verwenden.

+0

Unsere erste Implementierung hatte Java parse die XML's, aber wir fanden, dass Perl viel schneller und effektiver dabei ist. Also versuchen wir, diesen Job für Perl abzuleiten, was besser ist. –

+0

Sie tun wahrscheinlich etwas sehr Seltsames, wenn Perl XML schneller als Java analysiert. –

+0

Wir verwendeten xPath zum Navigieren in XML-Dateien und zum Abrufen von Knotenwerten. Aber ist Perl nicht auf diese Art von Arbeit ausgerichtet (Textanalyse und ähnliches)? –

3

JSON ist ein einfaches, leichtes Format zum Übertragen von Daten.

Sie könnten Rhino oder etwas Ähnliches zu Ihrem Toolkit hinzufügen und könnten zusätzliche Leistung (ganz zu schweigen von einer Scripting Engine) erhalten, aber dies hängt davon ab, wie komplex Sie Ihr Projekt planen.

0

Ich finde es auch seltsam, dass Ihr Perl-Code zum Parsen von XML deutlich schneller wäre als der entsprechende Code in Java. Aber selbst wenn es so ist, kann ich mir nicht vorstellen, dass es jemals schneller sein würde als der IPC. Selbst wenn Sie einen persistenten Perl-Prozess verwenden, müssen Sie die Daten immer noch senden, vermutlich über einen Socket, dann einige Daten zurückholen und schließlich in etwas Brauchbares deserialisieren.

Haben Sie versucht, die Leistung Ihres XML-Parsens in Java zu verbessern? Wenn Sie DOM oder eine Bibliothek eines Drittanbieters wie JDOM oder Castor verwenden, verwenden Sie stattdessen SAX. Oder vielleicht nur mit regulären Ausdrücken anstelle des XML-Parsen wäre schneller (jwz notwithstanding).

Auf jeden Fall würde ich empfehlen, einen Profiler mit Ihrem Java-Code unter Verwendung eines ersten zu sehen, ob es verbessert werden kann.

+1

Es gibt eine reine Perl-XML-Parsing-Bibliothek, aber niemand, der Geschwindigkeit interessiert, verwendet es. Die meisten Perl-XML-Parsing beinhaltet expat oder libxml2 unter der Haube, die schnell ist. – runrig

+0

Ich sehe nicht, wie das viel Unterschied machen wird. Selbst wenn das rohe XML-Parsing wesentlich schneller ist, haben Sie immer noch den IPC-Overhead. –

2

Inline::Java. Es funktioniert wirklich gut, sobald Sie es in Betrieb nehmen.Ich habe vor einigen Jahren an einem Projekt gearbeitet, bei dem eine Perl-Webanwendung mit einem Java-SOAP-Server für eine Echtzeitkommunikation kommuniziert hat und es war einfach viel zu langsam. Wir haben es durch ein System mit Inline :: Java für die Kommunikation ersetzt und es war viel schneller. Minimiere die Punkte, an denen du Objekte hin- und herbewegst, auf jeden Fall und versuche, diese Objekte einfach zu machen (wir bleiben mit Strings, Zahlen und Arrays stecken), damit die Dinge nicht außer Kontrolle geraten. Aber ich bin definitiv ein Konvertit!

Verwandte Themen