Felix: Arraygröße

Guten Tag,
ich muss in einem Programm eine größere Anzahl Strings halten.
Alles statisch, d.h. ich kann die direkt in den Code schreiben.
Es ist ein 2D Array Ausmassen von im Moment 1000*6 Feldern.
Am ende wirds vielleicht noch eine null mehr 10 000*6.
Ist das problemlos? Oder sollte ich die daten irgendwie anders halten?
Hinzu kommt noch, dass ich einen datensatz per zufall auswählen lasse, allerding mit zu- und abnehmender wahrscheinlichkeit. ich speichere also 0 bis array.length jede zahl bis zu 20 mal in einen 2. array. d.h. das ding ist max 200 000 felder lang. Problemlos oder doch nicht? Die Daten sind noch nicht da, ich kann nicht testen.

Gruß

Felix

  1. Moin Moin !

    ich muss in einem Programm eine größere Anzahl Strings halten.
    Alles statisch, d.h. ich kann die direkt in den Code schreiben.
    Es ist ein 2D Array Ausmassen von im Moment 1000*6 Feldern.
    Am ende wirds vielleicht noch eine null mehr 10 000*6.
    Ist das problemlos? Oder sollte ich die daten irgendwie anders halten?

    10.000 * 6 * durchschnittliche Stringlänge

    Mit 50 Zeichen durchschnittlicher Stringlänge brauchst Du allein mit den Daten bei fast 3 Megabytes, dazu kommen noch ein paar Bytes für Javas Speicherverwaltung.

    Hinzu kommt noch, dass ich einen datensatz per zufall auswählen lasse, allerding mit zu- und abnehmender wahrscheinlichkeit. ich speichere also 0 bis array.length jede zahl bis zu 20 mal in einen 2. array. d.h. das ding ist max 200 000 felder lang. Problemlos oder doch nicht? Die Daten sind noch nicht da, ich kann nicht testen.

    Warum baust Du Dir keine Dummy-Daten? Zwei bis drei verschachtelte for-Schleifen und Du hast beliebig viele Strings mit zufälligen Längen und zufälligem Text.

    Wie viele von den 60.000 Strings brauchst Du wirklich? 1%? 10 Stück?

    Ich würde die Strings in einer externen Datei (String-Datei) ablegen. In einer zweiten Datei (Index-Datei) würde ich Dateioffsets und Längen der Strings speichern. Wenn Du dann einen String brauchst, liest Du aus der Index-Datei den Offset und die Länge des Strings und liest dann aus der String-Datei den benötigten String. Damit ist ein Update der Strings sehr leicht: String-Datei austauschen und Index-Datei neu anlegen. Die Index-Datei brauchst Du nicht einmal selbst anlegen, Du prüfst beim Start einfach, ob die Index-Datei vorhanden und neuer als die String-Datei ist. Falls nicht, liest Du die String-Datei String-weise ein und speicherst Offsets und String-Längen in die Index-Datei. (Mal am Rande: Die Offsets der Strings reichen. Die Längen ergeben sich aus der Differenz zum nächsten Offset bzw. zur Dateilänge für den letzten String.)

    Glaube mir, es gibt keine statischen Daten. Strings sind das erste, was der Kunde am Programm ändern will.

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    1. Warum baust Du Dir keine Dummy-Daten? Zwei bis drei verschachtelte for-Schleifen und Du hast beliebig viele Strings mit zufälligen Längen und zufälligem Text.

      ok ja, das stimmt natürlich.

      Wie viele von den 60.000 Strings brauchst Du wirklich? 1%? 10 Stück?

      gleichzeitig meinst du? nur ein satensatz zur zeit.

      Ich würde die Strings in einer externen Datei (String-Datei) ablegen. In einer zweiten Datei (Index-Datei) würde ich Dateioffsets und Längen der Strings speichern. Wenn Du dann einen String brauchst, liest Du aus der Index-Datei den Offset und die Länge des Strings und liest dann aus der String-Datei den benötigten String. Damit ist ein Update der Strings sehr leicht: String-Datei austauschen und Index-Datei neu anlegen. Die Index-Datei brauchst Du nicht einmal selbst anlegen, Du prüfst beim Start einfach, ob die Index-Datei vorhanden und neuer als die String-Datei ist. Falls nicht, liest Du die String-Datei String-weise ein und speicherst Offsets und String-Längen in die Index-Datei. (Mal am Rande: Die Offsets der Strings reichen. Die Längen ergeben sich aus der Differenz zum nächsten Offset bzw. zur Dateilänge für den letzten String.)

      Also ich muss gestehen, dass ich diese Lösung nicht verstehe. Was ist eine String-Datei? eine Textfile oder wie? Das ginge natürlich und ich würde mir jedesmal den entsprechenden datensatz rausholen.
      dann stehe ich aber vir dem problem, dass jeder meine daten lesen kann und das soll nicht sein.

      Glaube mir, es gibt keine statischen Daten. Strings sind das erste, was der Kunde am Programm ändern will.

      in diesem Fall wohl nicht. Aber ich selber kann ja die daten ändern, ich kann ja in den Quelltext schreiben, aber der Anwender halt nicht.

      Alexander

      1. Moin Moin !

        Wie viele von den 60.000 Strings brauchst Du wirklich? 1%? 10 Stück?
        gleichzeitig meinst du?

        Genau.

        nur ein satensatz zur zeit.

        Dachte ich mir schon fast.

        Also ich muss gestehen, dass ich diese Lösung nicht verstehe. Was ist eine String-Datei? eine Textfile oder wie?

        Zum Beispiel. Und in der Index-Datei speicherst Du die Dateioffsets, um nicht jedes mal die gesamte Datei lesen zu müssen.

        Du kannst aber auch die Strings Null-Terminiert (C-String) direkt aneinanderhängen, damit kann ein String auch Zeilenumbrüche enthalten.

        Das ginge natürlich und ich würde mir jedesmal den entsprechenden datensatz rausholen.

        So war das gedacht.

        dann stehe ich aber vir dem problem, dass jeder meine daten lesen kann und das soll nicht sein.

        Nur derjenige, der auf das Dateisystem Zugriff hat. Wenn wir von einem Webserver reden, kannst Du die Dateien außerhalb des Document-Root lagern, oder den Zugriff auf die Dateien (z.B. per .htaccess) verbieten.

        Wenn Du eine Stand-Alone-Applikation baust, sieht's natürlich anders aus. Da hilft eine primitive Verschlüsselung we ROT13 oder XOR gegen neugierige Amateure. Profies können auch aus compiliertem Java nicht nur die Strings, sondern auch den Programmcode wiederherstellen.

        Glaube mir, es gibt keine statischen Daten. Strings sind das erste, was der Kunde am Programm ändern will.
        in diesem Fall wohl nicht.

        Darauf würde ich nie wetten.

        Aber ich selber kann ja die daten ändern, ich kann ja in den Quelltext schreiben, aber der Anwender halt nicht.

        So lange er keine Ahnung hat, was ein Java-Decompiler ist ... ;-)

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
        1. Nur derjenige, der auf das Dateisystem Zugriff hat. Wenn wir von einem Webserver reden, kannst Du die Dateien außerhalb des Document-Root lagern, oder den Zugriff auf die Dateien (z.B. per .htaccess) verbieten.

          jetzt verstehe ich auch warum hier immer das wort index-datei fällt usw. Ein Missverständnis, ich programmiere ein Application.

          Gruß

          Felix

          1. Moin Moin !

            jetzt verstehe ich auch warum hier immer das wort index-datei fällt usw. Ein Missverständnis, ich programmiere ein Application.

            Nein, jetzt ist es ein Mißverständnis. Ich rede nicht von index.html, ich rede von einer Datei, die als Index für die String-Datei dient und für jeden String dessen Offset speichert.

            Und wenn Du eine Applikation programmierst: Was hat das mit HTML und WWW zu tun?

            Alexander

            --
            Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"