Frage zu groesseren Datenmengen



  • Ich mache gerade eine Aufgabe in Java. Ich soll eine Methode unter Verwendung der Java 8 Stream API implementieren. Ich benutze dazu die ganz normale stream() Methode . Etwa so

    unsortedList.stream().filter.sort.foreach // usw.
    

    Jetzt wird mir folgende Frage gestellt.
    Was würden Sie evtl. anders machen, wenn Sie davon ausgehen müssten, dass die Liste auch Millionen von Einträgen haben könnte?


  • Global Moderator |  Mod

    Was ist deine Frage?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum Themen rund um die IT in das Forum Java verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Die Frage steht doch dort 🙂
    Fuer kleine Datenmenge passt mein Code. Aber wenn man Millionenen Eintraege hat. Wie wuerde der Code aussehen.



  • veri9 schrieb:

    Die Frage steht doch dort 🙂
    Fuer kleine Datenmenge passt mein Code. Aber wenn man Millionenen Eintraege hat. Wie wuerde der Code aussehen.

    Ich würde sagen, das kommt ganz drauf an.

    Der Code oben sorgt dafür, dass die Millionen Einträge zuerst gestreamt werden, dann wird der Stream gefiltert, dann wird alles, was durch den Filter gekommen ist, sortiert, dann wird das sortierte Ergebnis mit foreach irgendwie nachbearbeitet. Es wird also die ganze Datenbank durch mehrere verkettete Schritte gedreht, und zwar jedes mal komplett, bevor es in den nächsten Schritt geht, und synchron, d.h. der Aufrufer blockiert bis das alles durch ist.

    Wenn das nicht schlimm ist, braucht man garnix zu ändern.

    Wenn der Aufrufer eine GUI ist, die nicht minuten- oder gar stundenlang einfrieren darf, sollte man das Ganze in einem Background-Thread starten.

    Will man einen Fortschrittsbalken treiben, muss man diesen Kettenaufruf auflösen und das Ganze z.B. so formulieren, dass man jeden Eintrag durch alle Schritte verarbeitet, bevor man den nächsten drannimmt.



  • erstmal danke.

    Wenn die Datenbank 1 Mio Eintraege hat und zuerst wird der Stream gefiltert.Das heisst es wird jeder Eintrag auf das Filterkriterium geprueft. Die Ergebnismenge wird dann sortiert. Im Worst case haben es alle Elemente durch den Filter geschafft und danach wird jedes Element mit foreach ausgegegeben.

    Worst case: 1 Mio * ( 1 Mio * log 1 Mio )* 1 Mio = 1 Mio * 20 * 1 Mio = 1 Billion * 20

    Die Aktion wuerde also ewig ewig ewig dauern . Man muss das definitv dann optimieren 🙂


  • Global Moderator |  Mod

    Du solltest deine Mathematik noch einmal überprüfen.

    Wenn du 10 Steine erst bunt anmalst (O(N), sagen wir mal 10 Minuten) und dann der Größe nach sortierst (O(N*log(N), sagen wir mal 10 * log(10) Minuten = 23 Minuten), hast du dann wirklich 10 Minuten * 23 Minuten = 230 Minuten² gebraucht? Denk mal drüber nach.



  • oh we. Da merkt man dass mich die Lehrer durchs Abi geschleust haben 🤡

    Was sind denn eigentlich streams. Erst mal ist das doch nur eine Funktion

    stream()
    

    . Wir rufen diese Funktion auf einer Liste auf. Nun filtern wir. Wahrscheinlich entsteht nun zusaeztlich eine neue Liste mit nur den gefilterten Werten, da die urspruengliche ja nicht veraendert werden darf. Diese neue Liste wird nun sortiert und dann ausgegeben.



  • veri9 schrieb:

    Was sind denn eigentlich streams. Erst mal ist das doch nur eine Funktion

    stream()
    

    .

    Streams sind eine Liste verknüpfter Operationen. jede dieser Operationen erzeugt einen neuen Stream und die letze Operation(genannt Terminal Operation) macht den Output. Das ist irgendwas anderes als ein Stream (eine Liste, ein Wert, usw.). Die Operationen werden erst ausgeführt, wenn die Terminal Operation dran ist. Das nennt sich dann "Lazy Evaluation".

    Wenn du mit riesigen Datenmengen hantieren willst, dann nimm diese Library
    --> https://github.com/Conductor/stream-utils



  • Streamy2 schrieb:

    Wenn du mit riesigen Datenmengen hantieren willst, dann nimm diese Library
    --> https://github.com/Conductor/stream-utils

    ok 🙂 Was macht denn diese Library. Wieso ist sie schneller als parallelStreams() ?