Laden...

Performance von FTP Upload erhöhen

Erstellt von Rastadisasta vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.484 Views
R
Rastadisasta Themenstarter:in
13 Beiträge seit 2007
vor 13 Jahren
Performance von FTP Upload erhöhen

Hallo!

Habe eine generelle Frage zum Upload von Daten mittels ftp
Lade derzeit mehrer tausend Bilder per klassischem ftpupload auf einen Server.

Da mir die ganze Sache zu langsam ging habe ich den Upload auf mehrere Thread aufgeteilt.
Nur ist das Ergebnis noch immer nicht befriedigend.

Meine Frage dazu ist mit welcher Methode kann ich einen vergleichbare Performance beim Upload von Daten wie es normale FTP Programme haben erreichen.

Wenn ich meine Sache mit z.B.: Filezilla vergleiche kommen mir die Tränen. Aber ich weis nicht woran es liegt!

Wäre für jeden Hinweis sehr dankbar.

Hier noch mein Code der von jedem Thread zum Upload der Datei benützt wird.

reqFTP = (FtpWebRequest)FtpWebRequest.Create(ftp_path);
reqFTP.Credentials = new NetworkCredential(ftp_un,ftp_pw);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;
				
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
				
FileStream fs = fileInf.OpenRead();
					
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, 0, buffLength);
				
while (contentLen != 0){
	strm.Write(buff, 0, contentLen);
	contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close()

Ja klarer weise kann ich alles um einiges schneller machen wenn ich alle Daten komprimiere uploade und am Server wieder dekomprimiere. Aber es muss doch so auch funktionieren.

S
8.746 Beiträge seit 2005
vor 13 Jahren

Es liegt ziemlich sicher an der .NET-Implementierung selbst. Das betrifft nicht nur FTP, sondern auch andere Teile des Frameworks, die nicht gerade performanceoptimiert wurden. Gutes Beispiel sind die Klassen im Kompressions-Namespace. Die hinken ihren (managed) Konkurrenten teilweise um Faktoren hinterher.

Bei FTP kann es z.B. daran liegen, dass die erlaubte Blockgröße bei FTP nicht ausgereizt wird. Probier einfach mal ein paar Konkurrenten aus. Für FTP gibts ja so einige, auch kostenfrei.

Gelöschter Account
vor 13 Jahren

kann es sein, das du dich für jede einzelne datei anmeldest-überträgst-abmeldest ?

btw:

fs.CopyTo(reqFTP.GetRequestStream(), buffLength );

das ist ein wenig kürzer als dein konstrukt, macht aber genau das gleiche 😉

Gutes Beispiel sind die Klassen im Kompressions-Namespace.

die wurden in .net 4.0 angeblich deutlichst verbessert.

R
Rastadisasta Themenstarter:in
13 Beiträge seit 2007
vor 13 Jahren

kann es sein, das du dich für jede einzelne datei anmeldest-überträgst-abmeldest ?

Joup das könnte sehr gut möglich sein 😉
Aber wenn ich mittels mehrer Threads auf diese Funktion zugreife müsste ich klarerweise dann für jeden Thread eine Verbindung öffnen… korrekt ?

Es liegt ziemlich sicher an der .NET-Implementierung selbst. Das betrifft nicht nur FTP, sondern auch andere Teile des Frameworks, die nicht gerade performanceoptimiert wurden. Gutes Beispiel sind die Klassen im Kompressions-Namespace. Die hinken ihren (managed) Konkurrenten teilweise um Faktoren hinterher.

Denke dass das Thema ftp schon eine Kernkomponente eines Frameworks ist. Schade das sich .Net nicht einmal auf die Steigerung der Performance stürzt!

Schonmal 1000 Dank an euch bedei!

Gelöschter Account
vor 13 Jahren

Aber wenn ich mittels mehrer Threads auf diese Funktion zugreife müsste ich klarerweise dann für jeden Thread eine Verbindung öffnen… korrekt ?

ja aber du musst nciht für jede datei die verbindung immer wieder neu aufbauen. der verbindungsaufbau ist teuer...

des weiteren glaube ich das deine festplatte in der regel immer schneller sit als deine netzwerkkarte... daher halte cih das mit mehreren threads für sinnfrei, solange du kein ueber-raid-festplatten-rack hast.

L
95 Beiträge seit 2009
vor 13 Jahren

Ansonten probier doch einfach mal diese FTP-Library, ich nutze die auch, und bin SEHR zufrieden damit, auch was die Geschwindigkeit angeht... die Library "kommuniziert" wie z.B. FileZilla mit dem Server...

Das heißt aber auch, dass du die ChangeWorkDirecotry Methode aufrufen musst und so, dass das funktioniert... Du gibst der Library einen Befehl nach dem anderen an, also Connect, Login, ChangeWorkDirectory, UploadFile, etc. etc...

Hoffe, das hilft dir 😉

Mfg Marc

R
Rastadisasta Themenstarter:in
13 Beiträge seit 2007
vor 13 Jahren

Super Danke!

Ich denke der Input hilft mir kräftig weiter! werds mal probieren die Verbindung nicht immer neu zu öffnen 😉

Und dann mal diese Library verwenden wenns nicht reicht!