Einlesen von Daten



  • Hi,
    ich hatte letztlich wieder so ne strange Idee die Performance zu steigern 🤡
    ...und zwar, in einem Programm sollen sehr viele Zeilen mit Zahlen eingelesen werden (ca 50 000 bis 100 000), was nimmt man fuer diese Aufgabe fuer einen "reader" oder Einlesedingsbums her?

    Ich wollte das zuerst mit einem Buffered Reader machen, hab mir aber nun ueberlegt, ob es nicht etwas viel Speicher verbraucht einen gepufferten Einlese(ich weiss nicht wie man das richtig bezeichnet, ich nenns jetz Einlesedings)Dings zu benutzen - Kann das sein, oder is das vollkommen egal, was ist die eleganteste Art die Zeilen einzulesen?

    Gibt es ein einfacheres Einlesedings als Buffered Reader, ich dachte schon an RandomAccessPointer, aber dann las ich, dass der irgendwie langsamer sein soll, stimmt das? Was gaebs noch?



  • Einfacher InputStream, musst dann halt die End-Of-Line chars selber parsen, aber ob die von BufferedReader implementierte methode viel langsamer ist, weiß ich auch nicht. Musst'e halt mal testen.

    MFG John



  • Er verbraucht nicht zuviel Speicher. (Es wird nicht zwingend die ganze Datei gepuffert) Wieviel Puffer-Speicher er verwendet, laesst sich ja einstellen.

    Also BufferedReader mit nem ordentlichen Puffer sollte hier passen.
    Zumal readLine sehr praktisch ist, wenn du sowieso zeilenweise arbeitest.



  • hm, InputStream hoert sich fuer mich (noch) nicht-Java-ianer irgendwie noch etwas vertrauter an... Werd mich mal einlesen - es ist halt immer so das Problem die Moeglichkeiten auch zu nutzen, wenn man noch absolut keine Ahnung hat, welche es eigentlich gibt.

    BufferedReader hab ich und das ist, soweit ich weiss momentan auch etwas der Flaschenhals und der bremst extrem runter. Ich hab allerdings keinen Plan, wie man den Puffer einstellen kann, kann mir evtl jemand nen Tipp geben? (evtl Link im Netz oder/und Stichwort?)

    Im allg. waer ich auch ueber Tipps zum Thema Performance in Java recht dankbar, gibts da allgemeine Tipps (Links?)
    Danke!!! 🙂



  • http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html

    InputStream input;
    BufferedReader lIn = new BufferedReader(new InputStreamReader(input));
    

    Der BufferedReader stellt dir das .readLine() zur Verfügung, deshalb musste nix selber parsen. Beim InputStream bekommste nur bytes zurück, die du checken musst ob sie End-Of-Line-Chars sind zb '\r', '\n' ...
    Alles roger? Die API empfiehlt sich in jedem Falle.

    MFG John

    Edit: Von was liest du eigentlich ein? Ein File, Console?



  • also ich lese von einem Textfile ein und bis jetzt hab ichs auch immer mit Readline gemacht. Wie gesagt es sind halt nen Haufen Zeilen und ich brauche alle, da ich beim Einlesen schon war rumrechne (ich lese das in son double Array ein pro Zeile das is wiederum ein Objekt mit einigen Variablen (DataLine) und dass kommt in eine DataList (=eine ArrayList die von mir abgeleitet is). Da ich zB die Summe aller Werte Brauche pro Spalte (die Werte sind per Tab separiert) werden beim Einlesen schon u.a. zB diese Addition durchgefuehrt. ausserdem gibts noch einen Schritt nachm einlesen (mit eben diesen Summen) und beim rausschreiben wird dann der letzte Schritt der Berechnung durchgefuehrt. Das ganze sollte so selten wie moeglich die Daten komplet durchlaufen und jeden Wert auch nur einmal beim einlesen und einmal beim rausschreiben anschauen. trotzdem braucht das einlesen ewig lange. Ich nutze ReadLine wie gesagt und hab mir eben (nur mal so intuitiv) wegem dem Wort 'Buffered' so meine Gedanken gemacht, ob das nich auch schneller ginge?

    Bin fuer alle Tips bezueglich ueblicher Performancelecks dankbar!!!



  • irgendetwas sagt mir, dass du den flaschenhals woanders suchen solltest.
    und zu fragen, wie du den buffer setzen kannst: schau einfach in der doku.
    java.sun.com ist dein freund.



  • Ok, werd ich mal machen - momentan kaempf ich grad eher damit das provisorische Layout auf GridBagLayout umzustellen, obwohl ich immer mehr der Ueberzeugung bin, dass man dazu eher einen Exorcisten braucht...

    Ich bin nur grob davon ausgegangen da der Schritt, nach meinem Output des Programms am laengsten dauert. Genaures kann ich aber auch noch nicht dazu sagen ohne in Glaubensfragen zu verfallen, da ich mich ebenfalls erst in nen Profiler etwas einarbeiten muss (dann folgen 1000 Threads, bestimmt 😉 )

    Ich wollte nur mal sehn ob ich bei der Vorgehensweise mit BufferedReader schon so grundsaetzlich total aufm Holzweg bin, aber anscheinend passt das.



  • Lies doch erstmal die Zeilen in ein String-Vector ein uns teste, wie lange das dauert. Die Konvertierung kannst du dann ja direkt aus dem erstellten Vector heraus in einer eigenen Methode vollziehen.

    MFG John

    PS: Aus einem File würde ich so auslesen

    private Vector<String> readLinesFromFileToArray(String filename){
       Vector<String> lines = new Vector<String>();
       try{
          FileInputStream input = new FileInputStream(filename);
          BufferedReader lIn = new BufferedReader(new InputStreamReader(input));
          String line;
          while((line = lIn.readLine()) != null)
             lines.add(line);
          input.close();
       }catch(IOException ioEx){
          System.out.println(ioEx);
       }
       return lines;
    }
    


  • LOL - das sieht bei mir genauso aus, blos dass anstatt des Stringvectors eben mein von ArrayList abgeleitetes Objekt steht und in der while-schleife werden gleich die ersten Berechnungen gemacht (damit ich eben nicht einlesen, dann Berechnung drueberlaufen und dann schreiben muss sondern einlesen und berechnung gleichzeitig hab) Ich will das mit JRat genauer testen, bin aber momentan noch nich soweit.


Log in to reply