Datei zeilenweise rückwärts lesen

Status
Nicht offen für weitere Antworten.

heidiweber

Aktives Mitglied
Hallo,

ich muss in einer sequentiellen Datei hin- und herspringen. Daher habe ich folgende Methode geschrieben:

Code:
    /**
     * 
     * Liest den vorherigen Datensatz
     * 
     * @param position
     * @return
     * @throws java.lang.Exception
     */
    private String readPreviousLine(long position) throws Exception {

        StringBuilder cache = new StringBuilder();
        char c;
        if (position != 0) {

            this.posEnde = position;

            position = position - 3;

            raFile.seek(position);

            //Verarbeitung fuer Dateien mit variabler Datensatzlaenge
            while (true) {
                c = (char) raFile.read();
                if (c == '\n' || position <= 0 || c == '\uFFFF') {
                    break;
                }
                cache.append(c);
                position--;
                raFile.seek(position);
            }

            if (position > 0) {
                this.posStart = position + 1;
            } else if (position == 0) {
                cache.append(c);
                this.posStart = position;
            }
        }

        return cache.toString();
    }

Was meint ihr? Kann man an dieser Methode noch was verbessern/optimieren? Die Methode funktioniert. Nur ich finde ein bisschen langsam. Das kommt meiner Meinung daher, dass ich ja immer eine Stelle zurück muss (raFile.seek(position)😉.

Vielen Dank für die Hilfe
Grüße
Heidi
 
lies vorwärts ein und verwende dann StringBuilder.reverse oder drehe manuell im Speicher um?
das dauert doch keine Zeit, aber das Einlesen geht dann deutlich schneller,
vielleicht sogar mit anderen Methoden, gleich ein ganzes Array einlesen oder so
 
naja - so einfach geht das dann doch leider nicht.

Die Dateien können mehrere Millionen Datensätze haben. Und wenn ich z.B. den 5687453 Datensatz gelesen habe, möchte ich den vorherigen haben. Und da wieder von vorne zum Lesen anfangen....

Aber trotzdem vielen Dank für den Tipp.
 
wie lang ist so ein Datensatz durchschnittlich?

die Position hast du ja, dann geh von dort aus statt um 1 gleich um 1000 Schritte zurück,
lies 1000 Zeichen auf einmal in ein Array und schau dir dort vom letzen Index an rückwärts, ob '\n' oder '\uFFFF' enthalten ist,
Rest verwerfen oder gegebenenfalls weitere 1000 Zeichen lesen,
so kannst du auch gleich rückwärts einfügen
 
Die Dateien sind in der Regel variabel. Sonst wäre es ja nicht so schwer.

Der Tipp mit den 1000 Zeichen ist nicht schlecht (hätte ich auch selbst darauf können können🙂). Werde das einbauen und schauen, obs schneller wird - denke doch mal.

Vielen Dank
Grüße
Heidi
 
Man könnte auch kurzerhand einen Index aufbauen, der die Positionen der Zeilenanfänge aufnimmt, und sich anschließend via RandomAcessFile rückwärts hangeln.

Ark
 
Habe ich mir auch schon gedacht - nur können die Dateien evtl. auch 100 Mio. und mehr Datensätze haben und dafür ein Array....???

Vielen Dank euch allen für die Tipps - "werde das mit den 1000 Stellen rückwärtsspringen" austesten...

Grüße
Heidi
 
der Index kann ja auch wieder in einer Datei liegen, wie findest du innerhalb von 100 Mio. Daten überhaupt was?
kennst du das Konzept einer Datenbank?
 
das ist eine Datei, die von einem IBM-Großrechner kommt. Kann ich (leider) nicht ändern. Ich möchte den Datensatz ja nur anzeigen.

Vielen Dank auch an thE_29🙂
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben