![]() |
indy stream (Dateitransfer) wird immer langsamer..
hab folgendes problem
hab indy tcp client und server eingesetzt ( neuste version ) und damit will ich dateien transferieren wenn ich das nun im lan mache kann ich zwar fehlerfrei transferieren aber: 1. transfer wird nach start immer langsamer bis etwa < 200 kbs @ lan ! 2. client braucht knappe 80-90% CPU wärend dem transfer 3. client hat ca 40 - 50 MB an größe im ram wärend dem transferieren ( danach nimmer ) server hat immer 1-4% CPU auslastung und normale größe im RAM ( 4-5MB ) wenn ich übers internet transferiere hab ich noch folgendes problem dazu: 1. z.b. eine 30mb datei wird in 1min übertragen ( hab normales DSL ) und 2. datei ist dann aufm zielrechner 30mb groß, is aber CRC mäßig kaputt ( streaming funzt wohl net richtig ) aber im lan is CRC ok nach dem transferieren !! client code:
Delphi-Quellcode:
tcpclient einstellungen: fs := TFileStream.Create(uploadfile, fmOpenRead or fmShareDenyWrite); //Datei in FileStream einlesen form1.filebar.Max := fs.Size; form1.Label12.Caption := inttostr(fs.Size); form1.filebar.Position := 0; try form1.client.OpenWriteBuffer; form1.timer1.enabled := true; try form1.client.WriteStream(fs,true,true); form1.client.CloseWriteBuffer; except form1.client.CancelWriteBuffer; end; finally form1.timer1.enabled := false; fs.free; end; form1.filebar.Position := 0; form1.Label12.Caption := '--'; form1.Label10.Caption := '--'; form1.Label14.Caption := '--'; uploadoldstreampos := 0; receive/send buffer: 32768 ( schon mehr und weniger getestet.. hat sich nix geändert ) ascii filter: false maxlinelenght: 16384 maxlineaction: maException ( wird nich ausgelöst ) server code:
Delphi-Quellcode:
die progressbar is übrigends schön am worken :) einfach alle paar sekunden fs.position auslesenif (cmd = 'uplo') then begin if fileexists(Tfilelistbox(actclient.fileb).Directory+'\'+data) then begin athread.Connection.WriteLn('uploEXS'); end else begin athread.Connection.WriteLn('uploOK'); fs := TFileStream.Create(Tfilelistbox(actclient.fileb).Directory+'\'+data, fmCreate or fmShareExclusive); with AThread.Connection do begin try SizeOfIncomingStream := ReadInteger; //Größe des Streams empfangen ReadStream(fs, SizeOfIncomingStream); //und übergeben finally fs.Free; end; end; end; end; // upload ( hab ich auch schon weggelassen aber hat nix ausgemacht ) hat mir da einer ne idee ? will jetzt net grad das mit dem filesplitten machen.. muss doch so auch gehen ?! oder kann ich auch alternativ per writeln die ganze datei rüberbeamen bis ende erreicht usw ? oder is das noch schlechter wegen speed |
Re: indy stream (Dateitransfer) wird immer langsamer..
versuchs mal mit OpenWriteBuffer(8*1024).
|
Re: indy stream (Dateitransfer) wird immer langsamer..
Hi,
mit dem Problem hatte ich auch zu kämpfen ! Der Grund das die Übertragung immer langsamer wird liegt daran, das Du über den WriteBuffer sendest und der WriteBuffer versucht entsprechend Speicher zu allocieren. Ab 30 - 40 MB wird dann angefangen auf der Festplatte zu swappen um den Speicher zu allocieren und über 80 MB ist das senden dann nicht mehr möglich, weil es dann eine Buffer Exception auftritt. Es bleibt also gar nichts anderes übring als Dateien mit einer Grösse über ca. 20 MB aus Performance Gründen zu splitten. Was aber ganz und gar nicht zu Lasten der Geschwindigkeit geht, was meine eigenen Tests bewiesen haben. Wen Du Hilfe bei der Realisierung des Splitten brauchst einfach melden. Gruß DataCool |
Re: indy stream (Dateitransfer) wird immer langsamer..
dein source mit dem splitten hab ich auch.. aber wollte erstmal so testen ob das net auch ohne geht
wenn ich das richtig sehe is nemlich dann das ganze zu übertragende file im ram mit deiner methode ?! oder net? hab nur mal überflogen deinen code übrigends frag ich mich immernoch wieso das über internet nich richtig übertragen kann liegt das am gleichen problem ? buffer zu klein usw ? ich werde mal das mit dem OpenWriteBuffer(8*1024). testen.. |
Re: indy stream (Dateitransfer) wird immer langsamer..
Hi,
das Beispiel was Du von mir hast ist absolut alt, ich habe jetzt die Aufsplittung geändert, so das immer nur ein Paket was verschickt werden soll ich Ram gehalten Wird. Sprich verschickst Du 20 KB Pakte wird immer 20 KB über TMemoryStream im RAM gehalten, nimmst Du 1 MB Pakete dann halt ein ! MB im Ram. Gruß Data |
Re: indy stream (Dateitransfer) wird immer langsamer..
yeah :D
ok dann isses geil *g* wo haste das neue? (weis nimmer wo ich das her hab) ich geh mal schaffen.. wenn ich wieder da bin bau ich das mal ein dann :> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz