Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHTTP SchreibPuffer (https://www.delphipraxis.net/101386-idhttp-schreibpuffer.html)

Van HelF 12. Okt 2007 09:47


IdHTTP SchreibPuffer
 
Hallo,
Ich habe einen Downloadmanager geschrieben, der eine Datei in mehrere Chunks zerlegt und dann herunterlädt.
Da allerdings bei vielen Chunks viele festplattenzugriffe erfolgen wäre es sinnvoll die daten länger im RAM zwischenzuspeichern.
Ich verwende Indy 10 und der download läuft mit hilfe eines filestreams.
Gibt es eine möglichkeit eine art writebuffer (die bei vielen anderen downloadmanagern auch) festzulegen ?

Van HelF 15. Okt 2007 15:08

Re: IdHTTP SchreibPuffer
 
*push*

marabu 15. Okt 2007 15:45

Re: IdHTTP SchreibPuffer
 
Hallo,

deine Frage ist ziemlich allgemein gehalten, also gebe ich dir auch eine sehr allgemeine Antwort: Ersetze TFileStream durch TMemoryStream und setze TFileStream erst dann ein, wenn du wirklich auf das Dateisystem zugreifen möchtest.

Grüße vom marabu

Van HelF 15. Okt 2007 21:56

Re: IdHTTP SchreibPuffer
 
Delphi-Quellcode:
try
  fs:=TFilestream.create('C:\test.rar',fmcreate);
  http.Get(URL,fs);
finally
  fs.free;
end;
Ich wüsste nur leider nicht, wie ich hier irg. eine möglichkeit habe etwas zwischenzuspeichern.
Ich könnte die daten zwar komplett in einen memorysteam laden lassen, und dann erst schreiben, jedoch würde während des downloads sehr viel RAM verbrauchen.
Ich bräuchte wäre z.b. fs.SetWriteBuffer(1024) oder eine entsprechende möglichkeit bei der idHTTP komponente.

marabu 16. Okt 2007 14:54

Re: IdHTTP SchreibPuffer
 
Hallo,

hast du nicht geschrieben, dass du die Datei bereits in mehreren chunks herunter lädst? Das kannst du doch weiterhin so machen, sogar in parallelen Threads. Mache die einzelnen Teile so groß, wie es dir gefällt und schreibe sie dann an ihre Stelle im FileStream. Das Zerlegen macht für mich übrigens auch nur dann Sinn, wenn du multi-threading für das Herunterladen einsetzt. Ansonsten hätte ich keine allzu großen Ängste um die Zugriffsmechanik der Festplatte.

Freundliche Grüße

Van HelF 16. Okt 2007 19:25

Re: IdHTTP SchreibPuffer
 
BSP: man will eine 100 MB große datei laden und man hat 10 Chunks eingestellt, so ist jeder filestream 10 MB groß.
Es werden 10 Threads erstellt, und 10 Filestreams schreiben gleichzeitig auf die HDD.
Je mehr Chunks man einstellt umso mehr merkt man wie die festplatte arbeitet. (1 Chunk nicht hörbar, ab 5 Chunks deutlich hörbar).
Da dieses phämomen z.b. bei flashget (auch mit 5 Chunks) nicht auftitt gehe ich davon aus dass die schreib operationen auf den datenträger gepuffert werden.

marabu 16. Okt 2007 20:05

Re: IdHTTP SchreibPuffer
 
Deshalb hatte ich dir in Beitrag #3 geraten die FileStreams durch MemoryStreams zu ersetzen. Du öffnest nur noch einen FileStream und schreibst jeden MemoryStream an seine spezielle Position (entsprechend ContentRange) im FileStream, sobald der Chunk fertig geladen wurde. Habe ich mich jetzt klar genug ausgedrückt?

Van HelF 17. Okt 2007 09:49

Re: IdHTTP SchreibPuffer
 
wie allerdings schon in post 4 erwähnt würde dies zuviel RAM verbrauchen, die daten sollen nur kurz (~200KB) gepuffert werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz