• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Java - max. Stringlaenge?

Busta_inaktiv

Guest
nabend,

sitze gerade an einem FEM-Projekt und lese dafür u.a. 10k-quadratische Matrizen aus Dateien ein.

Wieviel kann ein String aufnehmen, und wie ist es mit StringBuffer?

Api verrät nichts, welchen Suchbegriff kann ich nutzen? "String max length java" etc ist hart nutzlos
 
Mitglied seit
20.09.2001
Beiträge
1.355
Reaktionen
0
soweit ich weiß kann nen string 2^31-1 zeichen haben vorausgesetzt du hast soviel speicher verfügbar ^^

jedoch gibts viele andere string funktionen im java die nur 65535 zeichen supporten, zb für writeutf bei nem outputstream das supportet nur die 65535
 

Busta_inaktiv

Guest
wie sieht's mit stringtokenizer aus, bzw streamtokenizer?

oder wo finde ich zu dem thema info?
 
Mitglied seit
20.03.2002
Beiträge
576
Reaktionen
0
Java Api:
"Every string buffer has a capacity. As long as the length of the character sequence contained in the string buffer does not exceed the capacity, it is not necessary to allocate a new internal buffer array. If the internal buffer overflows, it is automatically made larger."


Sollte also quasi unbegrenzte Größe erlauben (mal abgesehen davon, dass die JVM selber nur eine bestimmte Menge Speicher allokieren kann).
 
Mitglied seit
08.12.2001
Beiträge
2.053
Reaktionen
0
probiers doch mal selber aus. ich tip mal darauf dass die stringlänge nicht begrenzt ist, es also eher am verfügbaren ram liegen wird.
 
Mitglied seit
20.09.2001
Beiträge
1.355
Reaktionen
0
Original geschrieben von IncidentWaveSwitchin
Java Api:
"Every string buffer has a capacity. As long as the length of the character sequence contained in the string buffer does not exceed the capacity, it is not necessary to allocate a new internal buffer array. If the internal buffer overflows, it is automatically made larger."


Sollte also quasi unbegrenzte Größe erlauben (mal abgesehen davon, dass die JVM selber nur eine bestimmte Menge Speicher allokieren kann).

ja im normalfall 2^31-1 wenns auf nem 32bit system läuft :p + die speicherbegrenzung durch speicherplatz die dazu kommt.
 

Busta_inaktiv

Guest
Original geschrieben von Koestritzer
probiers doch mal selber aus. ich tip mal darauf dass die stringlänge nicht begrenzt ist, es also eher am verfügbaren ram liegen wird.
tja, mir fehlen leider die min. 4 gb ram um auch nur daris aussage zu verifizieren...

Der Speicherbedarf hängt völlig über, String verbraucht je Nutzzeichen > 2 bytes:

So kann ich z.B. eine 134.217.728-bytes-Datei (aka 128 MB) auch bei 384 MB der JVM zugewiesenem Speicher nicht vollständig in einen String einlesen mittels
Code:
        BufferedReader bufRead;
        String line = "";
        StringBuffer wholeFileBuffered = new StringBuffer();
        bufRead = new BufferedReader(new FileReader(file));
        while ((line = bufRead.readLine()) != null) {
            wholeFileBuffered.append(line);
        }
. (verbesserungsvorschläge? hab keine lust alle drölf möglichkeiten, strings aus dateien zu lesen, durchzutesten)

bei diesem beispiel ist die jvm ungefähr bei 85.650.000 gelesenen Bytes OutOfMemory.
(Interessanterweise ist das an der gleichen Stelle auch bei nur 256 MB zugewiesenem Speicher der Fall)

Aber egal, für mich reichts momentan völlig.
 
Mitglied seit
08.12.2001
Beiträge
2.053
Reaktionen
0
nuja ich hab ehrlich gesagt nicht soviel ahnung von java, aber notfalls kannste ja char arrays nehmen und die dann alá linked list verketten ^^
 
Mitglied seit
20.09.2001
Beiträge
1.355
Reaktionen
0
hatte aber irgendwo gelesen das man lieber splitten sollte in einzelne 65536 blöcke, aber wofür brauch man so riesige strings? O_o
 

Thubb

Guest
1. generiere den StringBuffer mit einer initialen Kapazität von (am besten) der grösse deines Files, so ersparst du dir das teure neu alloziieren von Speicher, wenn der Buffer voll ist...

2. benutze ein char-array der grösse 256KB (besser noch grösser, z.b. 1024 KB!!) als zwischen-puffer anstatt readLine() zu verwenden und die line immer zu appenden

Code:
        char[] cBuf = new char[262144];
        int offset = 0;
        StringBuffer wholeFileBuffered = new StringBuffer((int)file.length());
        BufferedReader bufRead = new BufferedReader(new FileReader(file));
        while ((offset = bufRead.read(cBuf)) > -1) {
            wholeFileBuffered.append(cBuf,0,offset);
        }
        if(bufRead != null)
            bufRead.close();

des weiteren solltest du der JVM mehr Heap-Speicher zuweisen:

java -Xmx[zahl]M DeineMainClass

wobei [zahl] für eine Zahl in MegaByte steht
 

Busta_inaktiv

Guest
sry, fast vergessen hier nochmal drauf einzugehen

@Thubb
zu 1. macht sinn, danke für den tipp
speicher hatte ich bereits per hand zugewiesen, siehe letzten post

dari, die dateien sollen ascii bleiben, darf also nicht binär lesen.
einige der eingesetzten algebra-libs verlangen nach strings, leider.
 
Oben