Announcement

Collapse
No announcement yet.

Welche Möglichkeiten bietet Java um Records in Dateien zu speichern und auszulesen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Welche Möglichkeiten bietet Java um Records in Dateien zu speichern und auszulesen?

    Hallo zusammen

    Ich habe folgende Record-Struktur:

    Record:
    int a1;
    int[] a2;

    Beispiel: Record No1 = 14,{15,25,36}
    Record No2 = 67,{15,25,36,45,56,78,89}

    Ich möchte diese Records in eine Datei speichern können und dann aber auch die Möglichkeit haben auf beliebiges Record zuzugreifen. Die Datei würde im Regelfall 500.000 Records haben.Und ein normales Szenario wäre zu sagen: Gib mir Das Record No 123000 und es sollte dann etwas in folgender Form zurückgeben: 78, {45,23}. also einen int und ein Array von ints (genaue anzahl variiert von 1 bis 100.000 oder mehr !!!).

    RandomAccessFile nehme ich an, kann hier nicht eingesetzt werden da man nicht wissen würde bei welches Byte man anfangen muss zu lesen. Man würde nicht wissen wo das 123000 Record anfängt da das array in jedem Record eine variierende Länge hat, und eins nach dem anderen alle Records auslesen bis das 123000e kommt ist auch keine realistische Lösung.

    Hat jemand von euch schonmal so eine Problematik gehabt? Wie sollte man hier vorgehen? Die Datei ist viel zu gross um davon auszugehen dass man genug Speicher hat um diese in ein ArrayList oder Vector zu laden!

    Gruss
    Ioannis

  • #2
    Hallo Ioannis,

    da kommt man mit dem RandomAccessFile wirklich nicht weiter, wenn die Feld-Länge beliebig ist. Eine Lösung wäre aber, zu überlegen, ob es nicht eine Maximalgröße gibt und dann einfach 0 aufzufüllen. Die Größe speichert dann ein zweites Attribut:

    int a1;
    int len;
    int[] a2 = new int[20];

    Dann kann man schön positionieren und auch sehr zügig Daten im Feld einfügen/löschen. Eine andere Lösung ist platt eine relationale Datenbank.

    Grüße

    Christian

    Comment


    • #3
      hi

      Maximale Länge ist hier nicht möglich anzugeben da es hier um einen Inverted Index handelt und das Array die Offsets eines Wortes innerhalb einer Text-Datei angibt. Da kann z.B. das Wort 1999 1 Million Male vorkommen und das Array würde entsprechend gross sein.

      Die Datenbank -Lösung wollte ich erstmal nicht berücksichtigen da das die Portabilität der Datei beeinträchtigen würde.

      Comment


      • #4
        Hallo,

        Im Prinizip benötigst Du einen Index (eine Index-Datei) der sagt wo welcher Record anfängt. Wenn ich das richtig verstanden habe ist Deine Datei wiederrum ein Indexdatei in eine Textdatei. Bevor ich sowas selber schreibe würde ich (wie von Christian schon angedeutet) zunächst prüfen, ob man nicht auf Basis bestehender Lösungen etwas basteln kann (Lucene, Derby-DB etc.). Ansonsten ist man schnell dabei eine Datenbank + Volltextsuche selbst zu schreiben.

        Viele Grüße,

        Alwin

        Comment


        • #5
          Hallo,

          Das Problem der Nutzung von Open-Source Software ist meiner Meinung nach dass wir beim Verkauf einer selbst-entwickelten Software die für Teil ihrer Funktionalität auf Open-Source (wie Lucene) beruht in rechtlichen Problemen geraten könnten. Oder ist es nicht so?

          Gruss
          Ioannis

          Comment


          • #6
            Hängt von der Lizenz ab. Die Apache-Lizenz (Lucene, Derby) erlaubt die kommerzielle Verwendung in closed source Produkten ohne Einschränkungen. Man muß aber darauf hinweisen, das man die Bibliothek verwendet/verändert hat.

            Comment


            • #7
              Hallo Ioannis,

              Du kannst deine Records als Klassen implementieren. Diese müssen das Interface Serializable implementieren. Zusätzlich programmierst Du die Methoden writeObject und readObject. Diese beschreiben, wie die Attribute der Klassen in den Stream gelesen und geschrieben werden.

              Mit Hilfe der Klassen ObjectOutputStream und ObjectInputStream (im Konstruktor übergibst du das FileStream-Object) kannst du dann die Objekte lesen und schreiben.

              Viel Erfolg
              Andreas

              Comment


              • #8
                das würde nicht gehen

                Hallo Andreas

                Es handelt sich um grosse volumen:
                2-3GB

                Wenn ich alles serialisieren würde, wäre das suchen es extrem langsam.

                Gruss
                Ioannis

                Comment

                Working...
                X