Frage

Mein noch nicht veröffentlicht Mit der Anwendung Delphi 2010 können Benutzer ihre Dateien auf meine Server hochladen.Im Moment verwende ich HTTPS POST zum Versenden der Dateien. Der (vereinfachte) Algorithmus lautet im Wesentlichen:

  1. Datei in „Slices“ aufteilen (jeweils 256 KB)
  2. POST es für jedes Slice an den Server

dh.für eine 1 MB große Datei:

--> Get Slice #1 (256KB)
--> Upload Slice #1 using TidHTTP.Post()

--> Get Slice #2 (256KB)
--> Upload Slice #2 using TidHTTP.Post()

--> Get Slice #3 (256KB)
--> Upload Slice #3 using TidHTTP.Post()

--> Get Slice #4 (256KB)
--> Upload Slice #4 using TidHTTP.Post()

Ich benutze Indy 10.Ich habe meinen Profiler immer wieder (missbraucht) und es gibt nicht mehr viel zu optimieren, außer die Upload-Routine selbst zu ändern.

Ich benutze es auch Multithreading, und obwohl ich mein Bestes getan habe, um meinen Code zu optimieren, sagen mir meine Benchmarks immer noch, dass ich es besser machen kann (es gibt andere gut optimierte Software, die eine erreicht). viel besseres Timing...fast doppelt so schnell wie meine Upload-Routine!)

Ich weiß, dass es nicht die Schuld meines Servers ist ... hier sind die Ideen, die ich noch erkunden muss:

  1. Ich habe versucht, Slices in einem einzigen POST zu gruppieren. Dies führte natürlich zu einer Leistungssteigerung (20–35 %), aber die Wiederaufnahmefähigkeit ist jetzt eingeschränkt.

  2. Ich habe auch darüber nachgedacht, SFTP/SSH zu verwenden, bin mir aber nicht sicher, ob es schnell ist.

  3. Verwenden Sie Web-Sockets, um fortsetzbare Uploads zu implementieren (wie diese Komponente), ich bin mir auch nicht sicher, was die Geschwindigkeit angeht.

Jetzt ist meine Frage:Kann ich etwas tun, um meinen Upload zu beschleunigen?Ich bin offen dafür beliebig Vorschlag, den ich implementieren kann, einschließlich Befehlszeilentools (sofern die Lizenz es mir erlaubt, sie mit meiner Anwendung auszuliefern), vorausgesetzt, dass:

  1. Fortsetzbares Hochladen wird unterstützt
  2. Schnell!
  3. Angemessene Speichernutzung
  4. Sichern und ermöglichen Sie die Anmeldung/Benutzerauthentifizierung

Außerdem möchte ich FTP aufgrund großer Sicherheitsbedenken nicht implementieren.

Vielen Dank!

War es hilfreich?

Lösung

Ich würde vorschlagen, eine Single zu machen TIdHTTP.Post() für die gesamte Datei, ohne sie überhaupt aufzuteilen.Du kannst den ... benutzen TIdHTTP.OnWork... Ereignisse, um zu verfolgen, wie viele Bytes an den Server gesendet wurden, damit Sie wissen, von wo aus Sie bei Bedarf fortfahren können.Wenn Sie fortfahren, können Sie die verwenden TIdHTTP.Request.CustomHeaders Fügen Sie der Eigenschaft einen benutzerdefinierten Header hinzu, der dem Server mitteilt, von wo aus Sie fortfahren, damit er seine vorherige Datei auf den angegebenen Offset zurücksetzen kann, bevor er die neuen Daten akzeptiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top