AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdHTTP SchreibPuffer
Thema durchsuchen
Ansicht
Themen-Optionen

IdHTTP SchreibPuffer

Ein Thema von Van HelF · begonnen am 12. Okt 2007 · letzter Beitrag vom 17. Okt 2007
Antwort Antwort
Van HelF

Registriert seit: 24. Okt 2005
Ort: Karlsbrunn
195 Beiträge
 
Delphi 7 Personal
 
#1

IdHTTP SchreibPuffer

  Alt 12. Okt 2007, 10:47
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 ?
  Mit Zitat antworten Zitat
Van HelF

Registriert seit: 24. Okt 2005
Ort: Karlsbrunn
195 Beiträge
 
Delphi 7 Personal
 
#2

Re: IdHTTP SchreibPuffer

  Alt 15. Okt 2007, 16:08
*push*
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: IdHTTP SchreibPuffer

  Alt 15. Okt 2007, 16:45
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
  Mit Zitat antworten Zitat
Van HelF

Registriert seit: 24. Okt 2005
Ort: Karlsbrunn
195 Beiträge
 
Delphi 7 Personal
 
#4

Re: IdHTTP SchreibPuffer

  Alt 15. Okt 2007, 22:56
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: IdHTTP SchreibPuffer

  Alt 16. Okt 2007, 15:54
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
  Mit Zitat antworten Zitat
Van HelF

Registriert seit: 24. Okt 2005
Ort: Karlsbrunn
195 Beiträge
 
Delphi 7 Personal
 
#6

Re: IdHTTP SchreibPuffer

  Alt 16. Okt 2007, 20:25
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: IdHTTP SchreibPuffer

  Alt 16. Okt 2007, 21:05
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?
  Mit Zitat antworten Zitat
Van HelF

Registriert seit: 24. Okt 2005
Ort: Karlsbrunn
195 Beiträge
 
Delphi 7 Personal
 
#8

Re: IdHTTP SchreibPuffer

  Alt 17. Okt 2007, 10:49
wie allerdings schon in post 4 erwähnt würde dies zuviel RAM verbrauchen, die daten sollen nur kurz (~200KB) gepuffert werden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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