Question

Mon pas encore libéré L'application Delphi 2010 permet aux utilisateurs de télécharger leurs fichiers sur mes serveurs.En ce moment, j'utilise HTTPS POST pour envoyer les fichiers, l'algorithme (simplifié) est essentiellement :

  1. Diviser le fichier en "tranches" (256 Ko chacune)
  2. Pour chaque tranche, POSTez-la sur le serveur

c'est à dire.pour un fichier de 1 Mo :

--> 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()

j'utilise Indy10.J'ai (ab) utilisé mon profileur encore et encore et il ne reste plus grand-chose à optimiser, à part changer la routine de téléchargement elle-même.

j'utilise aussi multithread, et même si j'ai fait de mon mieux pour optimiser mon code, mes benchmarks me disent toujours que je peux faire mieux (il existe d'autres logiciels bien optimisés qui atteignent un beaucoup meilleur timing... presque deux fois plus rapide que ma routine de téléchargement !)

Je sais que ce n'est pas la faute de mon serveur... voici les idées que je dois encore explorer :

  1. J'ai essayé de regrouper des tranches dans un seul POST, cela a naturellement entraîné une amélioration des performances (20 à 35 %), mais la capacité de reprise est maintenant réduite.

  2. J'ai aussi pensé à utiliser SFTP/SSH, mais je ne sais pas si c'est rapide.

  3. Utilisez des sockets Web pour implémenter un téléchargement avec reprise (comme ce composant), je ne suis pas sûr non plus de la vitesse.

Maintenant ma question est :puis-je faire quelque chose pour accélérer mon téléchargement ?je suis ouvert à n'importe lequel suggestion que je peux mettre en œuvre, y compris des outils en ligne de commande (si la licence me permet de l'expédier avec mon application), à condition que :

  1. Le téléchargement avec reprise est pris en charge
  2. Rapide!
  3. Utilisation raisonnable de la mémoire
  4. Sécurisez et autorisez la connexion/l'authentification de l'utilisateur

De plus, en raison de problèmes de sécurité majeurs, FTP n'est pas quelque chose que je souhaiterais implémenter.

Merci beaucoup!

Était-ce utile?

La solution

Je suggérerais d'en faire un seul TIdHTTP.Post() pour l'ensemble du fichier sans le fragmenter du tout.Vous pouvez utiliser le TIdHTTP.OnWork... événements pour garder une trace du nombre d'octets envoyés au serveur afin que vous sachiez où reprendre si nécessaire.Lors de la reprise, vous pouvez utiliser le TIdHTTP.Request.CustomHeaders propriété pour inclure un en-tête personnalisé qui indique au serveur à partir duquel vous reprenez, afin qu'il puisse restaurer son fichier précédent au décalage spécifié avant d'accepter les nouvelles données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top