ein Performanceproblem.

Status
Nicht offen für weitere Antworten.
B

Bebbo

Gast
Hallo!
Leider bin ich, was die Dateitechniken zum einlesen von Dateien und erstellen von Dateien angeht, nicht auf dem neustem Stand. Ich wollte euch fragen, ob ihr einige gute Seiten kennt, in denen derartige Codebeispiele zu finden sind, welche sich jedoch hauptsächlich auf die Verbesserung der Performance beziehen. Oder habt ihr gleich ein paar gute Codebeispiele parat, mit denen man die Performance bein Einlesen oder Erstellen von Dateien verbessern kann?
 

mic_checker

Top Contributor
guck doch im performance - unterforum, da findest du sicher einige hilfreiche links.

hast du schon ein konkretes performance problem oder willst du nur im vornherein wissen was du verwenden solltest ?
 
B

Bebbo

Gast
Naja mein problem ist folgendes:
Ich muss eine Datei möglichst schnell einlesen und deren inhalt bis auf jedes Byte verarbeiten und wieder den neuen Inhalt in eine neue Datei schreiben. Das heißt ich muss eine gute Lösung finden um die Datei möglichst schnell einzulesen, aber sie auch zu zerstückeln und sie zu verändern um sie dann in eine neue Datei zu schreiben...
 

Sky

Top Contributor
Wie liest Du denn zur Zeit ein und wie sieht deine Verarbeitung aus ? Wie viele Daten musst Du in welcher Zeitspanne bearbeiten ?

Pauschale Antwort sind meist nur sehr theoretischer Natur und dadurch nicht zwingend auf dein Problem anwendbar.
 
G

Guest

Gast
Ich denke da hast du Recht!
Das Problem ist nur, dass ich dir momentan keine genaue Antwort liefern kann, was folgende Gründe hat...
Ich habe damals ein Steganographieprogramm begonnen und hatte eine ganze Weile nicht daran gearbeitet und so muss ich mich jetzt wieder reinfitzen. Allerdings weiß ich, dass ich enorme Performanceprobleme hatte. Daher beschloss ich das Programm rund um die Dateioperationen neu zu schreiben und gleich bessere techniken zu verwenden. Die wesentliche Zeit wurde anscheinend verbraucht, weil ich statt Stringbuffer, String verwendet habe...
Jetzt versuche ich das ganze nur mit Stringbuffer und Bytebuffer. Bevor ich allerdings wieder zu weit gehe wollte ich mich vorher gleich nach besten Performancetechniken erkunden...
 

byte

Top Contributor
wenn du wirklich schnell sein willst, dann verzichte auch auf stringbuffer und beschränke dich auf bit und byte operationen.
 
G

Guest

Gast
Okay, ich werd das jetzt mal in kleinen Testklassen probieren. Wenn ich zufrieden bin, versuch ich das ganze dann wieder in mein Programm zu bringen...
 
B

Bebbo

Gast
Hab gerade beim Testen folgendes Problem bekommen...
Hier ist erstmal mein Code:


Code:
public class test {

	public static byte[][] distribute(byte[] buffer) {
	byte[][] stegamap = new byte[buffer.length][2];
	for(int pointer=0; pointer<buffer.length; pointer++) {
		stegamap[pointer][0] = buffer[pointer];
	}
	return stegamap;
	}
	
	public static void main(String[] args) {
                                // Es wird erstmal ein Array erstellt und mit fiktiven Daten(immer 1) gefüllt.
		byte[] buffer = new byte[3932214]; // *siehe unten
		for(int counter=0; counter<3932214; counter++) {
			buffer[counter]=1;
		}
		System.out.println("First fill finished.");
		byte[][] stegamap = distribute(buffer);
		System.out.println("Second fill finished.");

	}
}

*Es wurde als Zahl die Dateigröße eines Bitmap-Bildes(1280*1024) verwendet, mit der das Programm normalerweise ohne großen zeitverbrauch arbeiten sollte.

Die Methode distribute ist eigendlich dazu da, bestimmte Bits innerhalb einer Datei zu jedem Byte zuzuordnen, aber das ist momentan nicht der Fall: Jetzt soll die Methode lediglich ein neues Array(stegamap) und die erste "Zeile" dem Array buffer gleichsetzen, welches die eigendlichen Bilddaten enthält. Die 2. Zeile des Arrays stegamap ist erstmal nicht für dieses Problem wichtig.
Jetzt bekomme ich folgende Ausgabe:

First fill finished.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Wie kann ich diese Exception verhindern und gibt es einen Weg die erste Zeile von stegamap irgendwie besser gleichzusetzen mit buffer?
 

Bleiglanz

Gesperrter Benutzer
möglicherweise ist java.nio.* was für dich, das einlesen eines files in ein byte[] sollte damit uU schneller sein
 
G

Guest

Gast
Vielen Dank, aber wie verhindere ich dadurch die Exception mit dem heap space?
Ich habe rausgefunden, dass sich dieses Array aufgrund seiner Größe nicht erstellen lässt:

byte[][] stegamap = new byte[3932214][2];

Gibt es dafür irgendeine Lösung?
 
B

Bebbo

Gast
Mal eine Frage, kann ich den heap space der JVM auch über den Editor Eclipse erweitern?
Und hat das irgendwelche Nachteile, wenn ich diese Exception so umgehe?
 

byte

Top Contributor
dein programm wird dann halt nur mit diesem parameter laufen und die systemanforderungen an die zielplattform sind dann halt höher. hat es denn so geklappt?
 
B

Bebbo

Gast
Achso... Wie kann ich rausfinden, wie hoch die anforderungen sind?
Ich habs noch nicht über ne Konsole probiert, ich wollt vorher versuchen dass über Eclipse irgendwie einzustellen, aber da gibts nirgends ne option wo ich den parameter verwenden kann?
 

byte

Top Contributor
Bebbo hat gesagt.:
Achso... Wie kann ich rausfinden, wie hoch die anforderungen sind?

???:L java -Xmx256M ... bedeutet dass java 256 MB RAM benutzen kann. das ist auf manch älterem system 100% des arbeitsspeichers.
 

lin

Top Contributor
Bebbo schrieb:
ich wollt vorher versuchen dass über Eclipse irgendwie einzustellen, aber da gibts nirgends ne option wo ich den parameter verwenden kann?

aber natürlich gibts das ;-) ein hoch auf eclipse! :)

Du klickst auf Run, dann auf Run..., dort gibst du unter main dein projekt an und die main methode, dann kannst du unter dem tabbed pane [arguments] unter VM arguments das argument -Xmx<size> eingeben, also z.B. -Xmx256M, dann auf [apply] klicken und nichts wie [run] :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y performanceProblem mit Font in applet Java Basics - Anfänger-Themen 8

Ähnliche Java Themen


Oben