Problem beim Speichern eines Attachments

FenchelT

Bekanntes Mitglied
Hallo zusammen,

ich habe ein Problem beim Speichern eines EmailAttachments auf einem NetzwerkShare.

Codeschnipsel:
in = InputStream
out = OutputStream

Java:
in = null;
					Multipart mp = (Multipart) part.getContent();
	
					for (int i = 0; i < mp.getCount(); i++)
					{
						BodyPart bp = mp.getBodyPart(i);
	
						if (!Part.ATTACHMENT.equalsIgnoreCase(bp.getDisposition()))
						{
							continue; // Mache nix, da kein Attachment
						}
	
						in = bp.getInputStream();
						out = new FileOutputStream(new File(ziel));
						//outLokal = new FileOutputStream(new File("C:\\temp\\lokal.zip"));
						
						int k;
	
						System.out.println("Start while Schleife " + DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()));
						while ((k = in.read()) != -1)
						{
							System.out.println("DEBUG => Streamwert: " + k);
							out.write(k);
						}
						System.out.println("ENDE while Schleife " + DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()));
						// Streams schliessen
						in.close();
						out.close();
	
						retVal = true;

Ich lese das Attachment als Stream und schreibe es dann direkt in die Freigabe auf dem NetzwerkShare in einem entferneten Netzwerk.

Die Dateien sind ca. 20KB gross.

Schreibe ich die Datei lokal in einen Ordner ist der Vorgang binnen 1 Sekunde erledigt.
Der gleiche Vorgang dauert aber auf der Netzwerkressource 8 Minuten.
Ich habe mir das Ganze im Taskmanager angesehen.
Netzwerklast: 0,01%
CPU-Last: 7%

Hat einer eine Idee, warum das Schreiben auf einen UNC-Share so extrem langsam von statten geht?

Vielen Dank
FenchelT
 
Gerade mal umgestellt auf einen BufferedOutputStream.

Nun rennt es auf der Netzwerkressource genau so schnell wie lokal.
Verstehe zwar noch nicht ganz warum, aber trotzdem, das Problem ist erledigt.
 
ich versuch es mal so zu erklären ...

wenn du direkt OutputStream.write(InputStream.read()) machst (und nichts anderes machst du in deiner while) dann belastest du bei JEDEM BYTE beide hardware-resourcen ... du liest also genau ein byte ein und sendest dann auch genau ein byte ... und das jeweils in eigenen paketen ... dadurch erzeugst du einen RIESIGEN overhead den vermutlich dein upstream einfach nicht leisten kann ...

wenn du nun BufferedStreams nutzt ... und dann auch entsprechend der buffer-größe mit byte-arrays arbeiten würdest ... liest du auf einmal einen großen batzen in den RAM ... verarbeitest diesen ... und schreibst ihn in möglichst großen stücken wieder raus ...
was nun passiert leuchtet ein : die pakete werden randvoll mit nutzdaten gepackt ... und damit der overhead minimiert ... und da du jetzt auch gleich eine größere menge am stück sendest hast du zusätzlich einen geringen performance boost ...

und das alles zusammen macht eben den unterschied ...
 

Neue Themen


Zurück
Oben