# file --> byte[]



## Guest (13. Aug 2007)

hallo!

ich habe ein programm, welches hibernate mit hsql nutzt. hier habe ich ein objekt, welches ein byte[] nutzt um dateiinhalte zu speichern, welches dann in die db geschrieben wird. der byte[] inhalt geht in ein binary feld, so kann ich dateien direkt in der db ablegen und später wieder auslesen usw. das ganze funzt auch hervorragend, abgesehen davon, das natürlich das objekt mit dem byte[] bei großen dateien irgendwann die grätsche macht.

wenn ich das objekt initialisiere, wird die datei als parameter genommen und mit der folgenden methode in das byte[] zerlegt:


```
Aufruf:
byte[] data = copyBytes(pData);

methode:
private byte[] copyBytes(File pData) throws IOException {

		FileInputStream in = null;
		ByteArrayOutputStream out = null;
		try {
			in = new FileInputStream(pData);
			out = new ByteArrayOutputStream();
			int c;

			while ((c = in.read()) != -1) {
				out.write(c);
			}

		} finally {
			if (in != null) {
				in.close();
			}
			if (out != null) {
				out.close();
			}
		}
		return out.toByteArray();

	}
```

das ganze funtionier so bis ca 60 MB, danach hängt das programm sich auf.

gibt es eine möglichkeit das ganze so hin zu biegen, das einem nicht der arbeitsspeicher voll geschrieben wird bis nichts mehr geht?


----------



## grayson (13. Aug 2007)

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

das passiert bei zu großen dateien.

ach ja, der post war ich


----------



## SlaterB (13. Aug 2007)

dir ist schon klar wo der Fehler liegt, und du suchst jetzt nach einer anderen Möglichkeit,
die Daten in die DB zu bekommen?


falls dir etwas google-Suche zusagt:
http://www.google.de/search?hl=de&q=Hibernate+binary+stream&meta=

auf die Schnelle habe ich da
Blob blobbi = Hibernate.createBlob(InputStream);
gefunden,

wäre vielleicht auch nützlich anzugeben, wie du bisher dieses riesige Array in die DB speicherst


----------



## grayson (13. Aug 2007)

naja, das speichern des byte arrays wird ja von hibernate übernommen, daher hab ich da auch keine probleme. das einzige problem ist das zusammenstellen des objektes bevor ich es der hibernate session vor schmeisse , bzw wenn ich es aus der db raus hole.  das speichern etc ist simpel und wird durch hibernate gepuffert. aber wie ich son riesiges array selbst so manage, das es mir nicht den speicher voll belegt z.b. temporärer festplatten puffer oder so, da hab ich keine ahnung


----------



## Guest (21. Sep 2007)

schonmal versucht den Heap Space zu erhöhen (-XmxSIZE, z.B. -Xmx512M)?  
Oder reicht der Arbeitsspeicher dafür nicht?


----------



## Wildcard (21. Sep 2007)

Den ByteArrayOutputStream brauchst du schonmal nicht, der erzeugt nur massiven Overhead.
Aber ansonsten, 60 MiB sind 60MiB. Default sind 62 erlaubt, da wirst du wohl den Speicher erhöhen müssen.


----------



## kopfsalat (21. Sep 2007)

Folgende Unterscheidung ist elementar:

Ist das Array prinzipiell groß genug, um in deinen Arbeitsspeicher zu passen ?
Wenn _ja_, dann brauchst du lediglich die Heap-Size für die JVM anzupassen, so dass die JVM auch entsprechend viel Speicher nutzt.
Wenn _nein_, dann musst du die Übertragung der Daten in die Datenbank sowieso völlig anders vornehmen. Deine jetzige Methode will ja das komplette byte-Array zurückliefern, was aber nur geht, wenn dieses zum Ende der Methode komplett im Speicher liegt.
Vielleicht kann man hibernate alternativ auch einfach eine Datei übergeben, die dann von dort eingelesen wird (ich habe keine Ahnung von hibernate) ? Dann könntest du die Daten in dem gewünschten Format zunächst in eine Datei schreiben, und nur deren Namen dann an hibernate übergeben.


----------



## byte (23. Sep 2007)

Wie Slater schon sagte: Übergib die Rohdaten als Blob und nicht als Byte-Array.


----------

