Anzeige:
Ergebnis 1 bis 15 von 15

Thema: [Java] Wie Schnelles Ausparsen von Variablen (chars, ints, ...) aus Streams?

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    [Java] Wie Schnelles Ausparsen von Variablen (chars, ints, ...) aus Streams?

    Grüssi!


    Ich muss aus einem Stream den ich übers Netz transportiere, große Mengen von ariablen ausparsen, und mein Problem ist, dass es zwar PrintWriter gibt, die Variablen ohne Probleme schreiben können, einen PrintReader gibt es nicht.

    D.h. ich müsste die einzelnen z.B. ints aus einem String ausparsen, den ich zuvor aus dem Stream erzeuge.
    Dabei entsteht viel Garbage und außerdem viel Overhead.

    Kennt irgendwer eine Möglichkeit, aus einem Stream z.B. Characters oder Ints oder was weiß ich sehr SCHNELL auszuparsen, egal ob ich eine externe Bibliothek benutzen muss oder Möglichkieten nutzen kann, die das JDK bietet.
    Klasse wäre natürlich, wenn jemand eine schnelle Library kennt, die genau für diesen Zweck entwickelt wurde...
    Wie gesagt, es muss wirklich sehr schnell gehen....
    Geändert von Lin728 (19-08-2017 um 18:32 Uhr)

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Wenn du zeilenweise Daten bekommst, kannst du sehr einfach mit einem BufferedReader ganze Zeilen lesen.

    Ein StringTokenizer (java.util) zerlegt dir den dann in einzelen Stücke.
    Das Parsen der Teile können eh die Wrapperklassen der entsprechenen Typen, also zB für int Integer.parseInt

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Langsam...

    Hi anda_skoa!

    Ja, ich weiß, so hab ich es bis jetzt auch immer gemacht, aber da entsteht enorm viel Overhead und es ist enorm langsam.
    Stream -> String -> Substring -> String-Parsen
    Dabei muss jeweils für String und Substring speicher angefordert und entsorgt werden

    Ich würde was suchen, was aus Streams direkt Variablen rauslesen kann, ohne den ganzen Umwandel-Overhead.
    Geändert von Lin728 (19-08-2017 um 18:32 Uhr)

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ein textbasiertes Protokoll hat immer Overhead.

    Das String lesen wirst du nicht vermeiden können, es sei denn du hast ein garantiertes Encoding das mit einem Byte pro Char auskommt, zb Latin1.

    Wenn du den String selbst parsen willst, um keine Substrings zu erzeugen, dann einfach drüber iterieren.
    Wenn ein Integer erwartet wird ist der ziemlich trivial zu parsen, du musst nu von jedem Zeichen das Zeichen '0' abziehen und erhälts den Nnumerischen Wert.
    Pro weiter Stelle das bisherige Resultat mit 10 mutliplizieren.

    Allerdings ist es IMHO ziemlich fraglich, ob der zusätzliche Aufwand bei der Implementierung und Wartung den minimalen Performance-Vorteil rechtfertig.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    31.05.2002
    Beiträge
    24
    schon mal bei apache.org gechaut? Die haben da IMHO ein paar Klassen für Reguläre Ausrücke ... vielleicht schafft das ja abhilfe.
    --
    [] -> may the source be with you.

  6. #6
    Registrierter Benutzer Avatar von fs111
    Registriert seit
    23.03.2002
    Beiträge
    594
    Wäre es nicht evtl. sinnvoll das ganze in XML zu verpacken und einen SAX-Parser darauf loszulassen, die XML APIs sind ja alle gut gepflegt.

    fs111

  7. #7
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    und mit ObjectOutputStream? Für die primitiven Datentypen gibts ja wrapper-klassen.

    Dann sollte sich da doch mit ObjectInputStream und Rtti oder so was machen lassen.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  8. #8
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Hmmm...

    So wies aussieht werd ich mir wohl selbst einen Parser implementieren müssen

    Das Problem mit Sax-Parsern und XML ist, dass ich wieder sehr viel Netzwerkoverhead habe, was auch nicht sein darf. Außerdem sind zwar die Parser schnell, aber das herauskitzeln der Werte genau wieder so langsam, da ja alles über Events passiert
    Geändert von Lin728 (19-08-2017 um 18:32 Uhr)

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von peschmae
    und mit ObjectOutputStream? Für die primitiven Datentypen gibts ja wrapper-klassen.
    Ja, das ist das einfachste, aber dann beschränkt man sich darauf, dass beide Verbindungspartner in Java implemeniert sind.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  10. #10
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Und wenn du das gesamte irgendwie als Unicode oder ähnliches konvertierst?

    MfG Walfisch

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  11. #11
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Original geschrieben von anda_skoa
    Ja, das ist das einfachste, aber dann beschränkt man sich darauf, dass beide Verbindungspartner in Java implemeniert sind.
    Ich hab jedenfalls nichts anderes gelesen.

    @ceisserer: Wie ist das genau?

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  12. #12
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Sieht gut aus!

    und mit ObjectOutputStream? Für die primitiven Datentypen gibts ja wrapper-klassen.
    Ich dachte, da Ihr das mit den Wrapper-Klassen erwähnt hattet, dass man die int, bytes, etc. zuerst in Ihre Wrapper verpacken muss, da ObjectOutputStream nur Objecte und keine primitiven Datentypen handeln kann.

    Jetzt hab ich mir die APIDocs angesehen, und tatächlich, da gibt genau das was ich gesucht habe: readInt(), writeIn(),....

    Jetzt muss das nur noch mit der MS-JVM, Netscape-4.x (Java-1.1.5) und 1.2+ gehen, dann bin ich restlos glücklich!!
    Geändert von Lin728 (19-08-2017 um 18:33 Uhr)

  13. #13
    Registrierter Benutzer Avatar von fs111
    Registriert seit
    23.03.2002
    Beiträge
    594
    Darf man auch erfahren, was Du da genau tust?

    fs111

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Du kannst auch DataOutputStream und DataInputStream verwenden wenn du nur primitive Typen übetragen musst.

    Laut Doku "since JDK1.0", das sollte selbts die MS JVM schaffen

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Danke!

    Danke, diese Klasse ist ja noch besser!

    @fs11:
    Ich programmiere gerade an meinem Maturaproject, das isn Urlaubsplaner.
    Der User "blättert", prktisch nach vorne und der Client muss für ~50User, 35 Tage alle Tagesdaten runterladen, ausparsen und anzeigen.
    Geändert von Lin728 (19-08-2017 um 18:33 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •