Strings zu groß um damit zu arbeiten

Status
Nicht offen für weitere Antworten.
C

Christian76

Gast
Hallo,

eigentlich passt meine neue Frage noch zu meinen alten Forumseintrag: "FileWriter zu laaaaam". Ich habe gedacht
mein Problem liegt darin das ein sehr großer String zu lange braucht um abgespeichert zu werden. Ja, das stimmt
auch. Aber das liegt nicht nur am FileWriter. Also, meine Strings habe mehr als 1000000 Stellen und die Methode
String.lenght() benötigt für diese Ausgabe einige Minuten.

Jetzt wollte ich diesen String irgendwie aufteilen und blos weg von der Klasse String. Kennt ihr da eine Möglichkeit?

Gruß
-Christian
 
C

Christian76

Gast
Der String kommt von der Methode toString() der Klasse BigInteger.


Code:
String strWert = bigINT.toString();

das dauert so lange, kennst du da einen anderen Weg?
 

The_S

Top Contributor
Naja, bei 1 Million stellen ... was musst du denn damit machen? Bzw. für was brauchste so ne rießige Zahl?
 

The_S

Top Contributor
Und die Primzahlen willst du dann in eine Datei schreiben!? Für solche großen Dimensionen sollte es keine arg viel bessere/andere Möglichkeit geben. Evtl. ist ein toByteArray und dann dieses Array schreiben schneller.
 
C

Christian76

Gast
Habe das gerade überprüft, klappt hervorragend. Kennst du eine Methode, der String ähnlichen Klassen, wie z.B.
BufferedString, der ich dieses Bytearray übergeben kann, und dann irgendwie einen String bekomme?

Ich will nicht die Elemente dieses Byte Arrays mit Array[Nummer] ansprechen.
 

The_S

Top Contributor
Dann hast du doch wieder einen String ... ???:L Warum behältst du nicht einfach deinen BigInteger und arbeitest damit weiter? Wozu musst du denn noch die einzelnen Stellen manipulieren?
 
C

Christian76

Gast
Ok, wie ist mir egal, aber ich muss die Zahl die in dem BigInteger steht irgendwie in eine Datei kriegen. Und beim
Ausführen der Methode:

Code:
FileWriter.write(BigInteger.toString);

geht er in die Knie.
 
C

Christian76

Gast
also wenn ich:

Code:
FileWriter.write(BigInteger.toByteArray());

ausführe, steht folgendes in der Datei:

[B@113beb5

???
 

Yzebär

Bekanntes Mitglied
Wie wäre es denn den großen String in mehrere kleine zu zerlegen und diese nacheinander in die Datei zu schreiben, dann kann man nämlich auch noch die Zeilenumbrüche mit einfügen?!
 

deleted

Bekanntes Mitglied
Code:
import java.io.*;
import java.math.*;

public class Test {
	public static void main(String[] args) throws Throwable {
		
		BigInteger grosseZahl = new BigInteger("109545"); 
		
		byte[] ausgabe = grosseZahl.toByteArray();
		int zahlenLaenge = ausgabe.length;
		FileOutputStream fos = new FileOutputStream ("zahl.txt");
		fos.write(ausgabe);
		fos.close();
		
		byte[] eingabe = new byte[zahlenLaenge];
		FileInputStream fis = new FileInputStream ("zahl.txt");
		fis.read(eingabe);
		
		System.out.println((new BigInteger(eingabe).toString()));
		
	}
}

schau dir das mal an, vielleicht hilft es.

Habe es nochmal etwas überarbeitet.
Wie du sehen kannst, ist es kein Problem das Ganze zu speichern und wieder zu lesen.
Du musst nur noch die Länge des ByteArray als Index speichern.
Das kannst zu z.B. in dem Speicherfile vor deiner Zahl erledigen.

Das Ganze ist natürlich nur zur Demonstration.
Das musst du von der Performance noch gründlich überarbeiten :)
 
G

Guest

Gast
@ R.B.

vielen Dank für deine Hilfe. hat bei mir auch geklappt. Aber ich wollte weg von dem INT. Weil ich druchs INT
begrenzt durch die Summe der Stellen bin.

@ alle (und besonders an Hobbit :) )
Ich habe Folgendes probiert:

Das Speichern klappt wunderbar:

Code:
FileWriter FW1 = new FileWriter("Wert.txt");

String Wert= new String(new BigInteger("100000000000000000").toByteArray());             
FW1.write(Wert);

FW1.close();

nur mit dem Lesen habe ich Probleme. Das Interessante dabei ist: Das meine Ergebnisse in Abhängigkeit
zur Zahlengröße variieren. Bei Kleinen klappt es wunderbar, aber bei Zahlen jenseits der mehrfachen
Millionenstellen klappts nicht mehr. Die eingelesenen Zahlen sind nicht mehr die Gleichen. Ich zeige
jetzt mal meine Codeversuche:

Versuch 1 zum Lesen:

Code:
String Wert="";
try
{
         File eingabedatei = new File("Wert.txt"); 
         FileReader fr = new FileReader(eingabedatei); 
         BufferedReader br = new BufferedReader(fr); 
         String zeile=br.readLine();
         while ( zeile != null ) 
         { 
                 Wert+= zeile;
                 zeile=br.readLine(); 
         } 
         br.close();  
}
catch (Exception eee){}

byte zahl[] = Wert.getBytes();
BigInteger objBig = new BigInteger(zahl);

Versuch 2 zum Lesen:

Code:
StringBuffer buffer = new StringBuffer();
try
{
        BufferedReader oRead = new BufferedReader(new FileReader("Wert.txt")); 
        
        while (true)
        {
               int gelesenInt = oRead.read();
               if(gelesenInt == -1){break;}
               buffer = buffer.append((char) gelesenInt);
         }
}
catch (Exception eee){}

byte zahl[] = buffer.toString().getBytes();
BigInteger objBig = new BigInteger(zahl);

Naja, wie beschrieben, beide funktionieren bis zu einer bestimmten Größe. Hoffe ihr könnt mir da weiterhelfen.

Gruß
-Christian
 

deleted

Bekanntes Mitglied
*edit2*

Ok, hatte das falsch verstanden...
Sorry!

*edit*

Habe den Code nochmal verändert:
Jetz lies das aber bitte durch.
Wenn du es nicht verstehst, frag halt...

Code:
import java.io.*;
import java.math.*;

public class Test {
	public static void main(String[] args) throws Throwable {
		
		
	
	
		BigInteger grosseZahl = new BigInteger("1");
		BigInteger multi = new BigInteger("10");
		
		for (int i=0; i<10000; i++) {
			grosseZahl = grosseZahl.multiply(multi);
		}
		
		
		byte[] ausgabe = grosseZahl.toByteArray();
		int zahlenLaenge = ausgabe.length; //seperat speichern
		FileOutputStream fos = new FileOutputStream ("zahl");
		fos.write(ausgabe);
		fos.close();
		
		System.out.println("Deine Zahl ist " + (zahlenLaenge) + " Byte groß");
		
		byte[] eingabe = new byte[zahlenLaenge];
		FileInputStream fis = new FileInputStream ("zahl.txt");
		fis.read(eingabe);
		fis.close();
		
		
		System.out.println((new BigInteger(eingabe).toString()));
		
		
		
	}
}

Ansonsten nutz lieber Fortran.
Ist in mathematischen Dingen schneller als Java...
 
C

Christian76

Gast
@ R.B.

Danke für deine Hilfe, mit deinem SC bin ich meinem Problem ein Schritt nächer gekommen. Aber wo wir gerade
beim Thema lesen sind:

Aber ich wollte weg von dem INT. Weil ich druchs INT
begrenzt durch die Summe der Stellen bin.


Komischer Weise klappt es wunderbar wenn ich mir die Summe der Stellen ermitteln lassen, aber sobald
ich es anders lesen lassen, geht gar nichts mehr. Ich versuche es gerade so:


StringBuffer buffer = new StringBuffer();
try
{
FileInputStream fileStream = new FileInputStream ("Zahl.txt");

int intzeichen;
// ein Zeichen lesen, -1 gibt das Ende der Datei an.
while ((intzeichen = fileStream.read()) >=0 )
{
// Das Zeichen ausgeben.
buffer.append((char)intzeichen);
}
// Datei schließen
fileStream.close();

}
catch (Exception eee){}

ich vermute mal, es liegt daran das ich mir die vorher geschriebenen Bytes als Char konvertiere. Vielleicht
wäre der Bytebuffer hier richtig, allerdings komme ich mit dem nicht klar.


Gruß
-Christian


@ Admin, wenns nervt, lösch das Topic ruhig.
 
C

Christian76

Gast
@ R.B.

Danke für deine Hilfe, mit deinem SC bin ich meinem Problem ein Schritt nächer gekommen. Aber wo wir gerade
beim Thema lesen sind:

Aber ich wollte weg von dem INT. Weil ich druchs INT
begrenzt durch die Summe der Stellen bin.


Komischer Weise klappt es wunderbar wenn ich mir die Summe der Stellen ermitteln lassen, aber sobald
ich es anders lesen lassen, geht gar nichts mehr. Ich versuche es gerade so:


Code:
                   StringBuffer buffer = new StringBuffer();
                   try
                   {
                       FileInputStream fileStream = new FileInputStream ("Zahl.txt"); 
        
                       int intzeichen;
                       // ein Zeichen lesen, -1 gibt das Ende der Datei an.
                        while ((intzeichen = fileStream.read()) >=0 ) 
                        {
                            // Das Zeichen ausgeben.
                            buffer.append((char)intzeichen);
                        } 
                        // Datei schließen
                        fileStream.close();

                   }
                   catch (Exception eee){}

ich vermute mal, es liegt daran das ich mir die vorher geschriebenen Bytes als Char konvertiere. Vielleicht
wäre der Bytebuffer hier richtig, allerdings komme ich mit dem nicht klar.


Gruß
-Christian


@ Admin, wenns nervt, lösch das Topic ruhig.
 

The_S

Top Contributor
Äh, wie schon erwähnt, du kannst den byte-output eines BigIntegers nicht so einfach in eine zahl konvertieren. Les die Datei wieder als Byte-Array aus und erzeuge damit dann deinen BigInteger!

btw anstelle auf >= 0 kannste auch einfach auf != -1 prüfen ;) .
 
C

Christian76

Gast
jaja, das Thema ist nicht tot zu kriegen.

Bin auch gerade da dran, aber wie kann ich es als Byte Array auslesen?

Habe schon den ByteBuffer benutzt. Aber da muss ich auch ein int als Größendeklaration
übergeben.
 

The_S

Top Contributor
Hier einfach so runtergeschrieben:

Code:
byte[] b = new byte[(int)file.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
bis.read(b, 0, b.length);
 
C

Christian76

Gast
meine Vorgabe ist, ich muss weg von einer INT Begrenzung. Durch INT habe ich eine
limitierte Summe an Stellen in diesem Fall.

Gibt es eine Möglichkeit eines dynamischen Arrays das einfach aus der Datei befüllt wird?
 

The_S

Top Contributor
Ich mag zu bezweifeln, dass du Probleme mit der "int-Begrenzung" hast. Vorher sollte dein Speicher voll sein!
 
C

Christian76

Gast
:lol: jo, das könnte passieren. Ich werde meinen Prof darauf hinweise wenn ich das Problem nicht löse. :lol:
 

The_S

Top Contributor
Ein int bietet dir ein Array von 2147483648 Elementen. Jedes Element besteht aus 8 Bit. Macht eine Zahl der Größenordnung von 2^2147483648 * 8. Sollte reichen ;) .
 
C

Christian76

Gast
Ja, das sehe ich eigentlich genauso, aber Vorgabe auf Unendlich viele Stelle ist Tatsache.

Der Computer der irgendwann diese Zahl berechnen kann, wird genug Speicher besitzen. :lol:

Ich brauche für eine mit 100000 Stellen schon mehr als 8 Stunden. :)

Aber zurück zur Frage, wie machen ich das am Besten? Gibs da was?
 

deleted

Bekanntes Mitglied
@Christian76
An dieser Stelle nur nochmal angemerkt:
Ein String ist für deine Situation in jedem Fall komplett ungeeignet, da Strings vom Compiler speziell behandelt werden.

String a = "test";
String b = "test";
a == b -> true!

Strings werden intern speziell gemanaged und sind für dich nicht absolut kontrollierbar.
Deshalb für mathematische Aufgaben ungeeignet.

Ein Array größer als einen Integer kannst du in Java durchas auch implementieren.
Allerdings nicht als Array sondern z.B. als eine Kette.

Allerdings wenn du wirklich so etwas vorhast, kann ich dir nur nochmal sagen:
Nimm Fortran. Java ist für mathematische Operationen auf Großrechnern nun wirklich nicht die erste Wahl...

btw. welcher Rechner soll eigentlich dein Programm ausführen?
Wenn du uns das verrätst, können wir dir vielleicht bessere Tipps geben...
 
C

Christian76

Gast
@ R.B.

ich denke mit den Zeichenketten wie du und Hobbit sie mir empfohlen haben, fahre ich nicht schlecht.
Mein Programm kann ja auch Primzahlen in beliebiger Größe überprüfen.

Darüber hinaus ist Java aufgrund der Performance (trozt Hotspot) eh für solche Dinge nicht gerade geeignet.
Fortan wäre durchaus eine Alternative gewesen, aber das Projekt sollte in Java umgesetzt werden.

Zu dem verwendeten Computer, nunja, ich hab hier einen Dualcore mit 2,4 Ghz und der kriegt nur
Zahlen mit ca. 100000 Stellen in ca. 8-10 Stunden hin. Einen praktischen Einsatzt denke ich wird
die Software nie haben. Denke es bleibt wohl ein lustiges Benchmarktool.

Vielen Dank für eure Hilfe.

Gruß
-Christian
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
N MySQL mit Strings Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
P Strings: equals vs == Allgemeine Java-Themen 47
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
W Collections Suche Collection, um Strings mit Indizees versehen Allgemeine Java-Themen 47
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
LimDul Mittels Streams aus Strings A B C den String A, B und C machen Allgemeine Java-Themen 12
Meeresgott Best Practice Strings auf Inhalte vergleichen Allgemeine Java-Themen 1
N DNA Strings vergleichen Allgemeine Java-Themen 1
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
K Vergleich von Strings von Objekten Allgemeine Java-Themen 4
J Strings int textdokumente speicher Allgemeine Java-Themen 3
KeVoZ_ Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben Allgemeine Java-Themen 6
K Strings sortieren: 2 Kritieren Allgemeine Java-Themen 5
A Vector Strings in Array splitten Allgemeine Java-Themen 6
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
K Bestimmten Bereich eines Strings lesen Allgemeine Java-Themen 6
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
H Strings vergleichen Allgemeine Java-Themen 9
O Mustererkennung in Strings Allgemeine Java-Themen 4
Y String-Collection: längste gemeinsame Strings / Prefixe Allgemeine Java-Themen 3
F Problem mit Strings Allgemeine Java-Themen 8
D Strings chemisch splitten Allgemeine Java-Themen 3
K Wörter in Strings zählen Allgemeine Java-Themen 7
L Strings nach sortiertem String zurück ordnen Allgemeine Java-Themen 0
L Strings nach gleichem Muster ordnen Allgemeine Java-Themen 4
L Fragen für Facharbeit: Analyse von Strings in Java Allgemeine Java-Themen 4
D Strings vergleichen; Komma ignorieren Allgemeine Java-Themen 3
K Java Operatoren mit Strings darstellen Allgemeine Java-Themen 8
G Strings erzeugen Allgemeine Java-Themen 20
B HTML Tags in Strings umwandeln Allgemeine Java-Themen 4
N Input/Output Vergleich von identischen Strings schlägt fehl Allgemeine Java-Themen 5
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
A ,,Textformatierungsbefehle" für strings deaktivieren Allgemeine Java-Themen 8
S Strings vergleichen Allgemeine Java-Themen 11
C Strings in Excel einlesen! Allgemeine Java-Themen 2
S Strings gehen "kaputt" wenn ich in CVS ein und wieder auschecke. Allgemeine Java-Themen 2
X Datentypen Prozentualer Abgleich zwischen 2 Strings (Pattern?) Allgemeine Java-Themen 3
R MD5-Hash eines Strings bestimmen Allgemeine Java-Themen 2
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
J String zerlegen in einzelne Strings Allgemeine Java-Themen 7
F Konstanten mir Strings "verknuepfen" Allgemeine Java-Themen 10
1 zwei Strings vergleichen Allgemeine Java-Themen 16
L Object Instanz anhand eines Strings Allgemeine Java-Themen 10
S vector & strings Allgemeine Java-Themen 26
N Strings mit null wiedergabe Splitten Allgemeine Java-Themen 4
K Strings sortieren (knifflig) Allgemeine Java-Themen 7
P Codierung der strings umändern Allgemeine Java-Themen 10
N Zahlen in Strings einer ArrayList sortieren Allgemeine Java-Themen 14
F 2 Strings zusammenfügen Allgemeine Java-Themen 2
D Strings von HTML befreien Allgemeine Java-Themen 17
S Strings zu Color-Instanzen parsen? Allgemeine Java-Themen 7
C Strings zwischen 2 Zeichen auslesen Allgemeine Java-Themen 7
T Explizite Typkonversation mit Strings Allgemeine Java-Themen 9
R Locale spezifische DateFormat Strings? Allgemeine Java-Themen 3
M Wie kann ich alle System.out Strings in ein log window umleiten? Allgemeine Java-Themen 6
R Java function die Strings escaped, sodass ich sie in Javascript verwenden kann? Allgemeine Java-Themen 4
ruutaiokwu objektreferenz eines strings... Allgemeine Java-Themen 9
data89 [Kurze Frage] Ähnlichkeit zweier Strings ermitteln Allgemeine Java-Themen 19
S bestimmte Strings spliten! Allgemeine Java-Themen 7
M Warum Strings mit equals vergleichen... Allgemeine Java-Themen 6
Daniel_L Suche nach ganzen Wörtern (wholeword) in Strings? Allgemeine Java-Themen 4
A Strings joinen, Standard-Library? Allgemeine Java-Themen 9
Y Mal wieder vergleichen von Strings.[Leider noch ein Problem] Allgemeine Java-Themen 18
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
A Auslesen von Strings aus einer xls-Datei Allgemeine Java-Themen 16
G Spezialfrage zu Strings Allgemeine Java-Themen 11
C Textteile aus Strings extrahieren? Allgemeine Java-Themen 6
J Teile eines Strings ersetzen Allgemeine Java-Themen 2
G schnell Strings vergleichen Allgemeine Java-Themen 4
J Name eines Strings durch einen String festlegbar? Allgemeine Java-Themen 2
G Strings zerlegen und substrings auslesen Allgemeine Java-Themen 2
Z Letztes zeichen eines strings löschen Allgemeine Java-Themen 3
V Speicherplatz eines Strings? Allgemeine Java-Themen 12
H MIDlets und Strings Allgemeine Java-Themen 2
C Pixelanzahl eines Strings ermitteln Allgemeine Java-Themen 12
T Strings darf nur Ziffern, +/- haben Allgemeine Java-Themen 9
A Fehler beim Ersetzen eines Strings Allgemeine Java-Themen 3
G Strings die Zahlen enthalten sinnvoll sortieren (A2 < A10 Allgemeine Java-Themen 4
G byte[] mit Strings füllen Allgemeine Java-Themen 2
H strings in datei verschlüsseln , auslesen mit klartext aber! Allgemeine Java-Themen 2
F Strings in JList ausrichten/links/rechts/mittig Allgemeine Java-Themen 10
M String#equals(), Probleme mit großen Strings? Allgemeine Java-Themen 4
H ein Teil des Strings rausfiltern Allgemeine Java-Themen 8
E Viele if Abfragen auf viele Strings --> Alternative zu if Allgemeine Java-Themen 8
V Lib für Strings suchen und ersetzen (erweitert) Allgemeine Java-Themen 3
P Schnelles Auslesen von Strings für Syntaxhighlighting? Allgemeine Java-Themen 2
X Strings aus einer ArrayList zählen Allgemeine Java-Themen 11
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
G Datei zeilenweise in Strings speichern Allgemeine Java-Themen 36
S Methode zum Zählen von Buchstaben in Strings gesucht Allgemeine Java-Themen 11
I vergleich und zählen von Strings Allgemeine Java-Themen 7
V Strings aus externen Dateien Einlesen (Sudoku) Allgemeine Java-Themen 25

Ähnliche Java Themen

Neue Themen


Oben