Arraygröße
Felix
- java
0 Alexander Foken0 Felix
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
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
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
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
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
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