2012-02-28 19 views
7

Mi aún por lanzarse La aplicación Delphi 2010 permite a los usuarios cargar sus archivos en mis servidores. En este momento estoy usando HTTPS POST para enviar los archivos, el (simplificado) algoritmo es básicamente:¿Cómo optimizar la rutina de carga con Delphi 2010?

  1. archivo partido en "cortes" (256 KB cada una)
  2. Para cada rebanada, publicarla en el servidor

ie. para un archivo de 1 MB:

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

estoy usando Indy 10. Yo (ab) usé mi perfilador una y otra vez y no me queda mucho para optimizar, excepto cambiar la rutina de carga.

También estoy usando multi-threading, ya pesar de que hice todo lo posible para optimizar mi código, mis puntos de referencia todavía me dicen que puedo hacerlo mejor (hay otro software que lo hacen bien optimizado lograr un mucho ! ... mejor tiempo casi dos veces más rápido que mi rutina de carga)

sé que no es culpa de mi servidor ... aquí están las ideas que todavía tengo que explorar:

  1. probé agrupación rebanadas en un solo POST, naturalmente esto dio como resultado un aumento de rendimiento (20-35%) pero ahora se reduce la capacidad de reanudación.

  2. También pensé en usar SFTP/SSH, pero no estoy seguro si es rápido.

  3. Use sockets web para implementar la carga reanudable (como this component), tampoco estoy seguro de la velocidad.

Ahora mi pregunta es: ¿hay algo que pueda hacer para acelerar mi carga? Estoy abierto a cualquier sugerencia de que puedo poner en práctica, incluyendo las herramientas de línea de comandos (si la licencia me permite enviar con mi solicitud), a condición de que:

  1. carga reanudable es compatible
  2. rápido!
  3. uso de memoria razonable
  4. Secure & permitir la autenticación de usuario/usuario

Además, debido a importantes problemas de seguridad, FTP es un no es algo que me gustaría poner en práctica.

¡Muchas gracias!

+1

¿La transferencia usa compresión/descompresión de datos? – mjn

+0

¿qué hay del lado del servidor? – kobik

+0

@mjn: yes (los segmentos ya están comprimidos antes de ser cargados + Yo uso TIdCompressorZLib de Indy) – TheDude

Respuesta

5

Sugeriría hacer un solo TIdHTTP.Post() para todo el archivo sin fragmentarlo en absoluto. Puede usar los eventos TIdHTTP.OnWork... para realizar un seguimiento de la cantidad de bytes que se enviaron al servidor para que sepa de dónde se puede reanudar si es necesario. Al reanudar, puede usar la propiedad TIdHTTP.Request.CustomHeaders para incluir un encabezado personalizado que le indique al servidor de dónde está reanudando, para que pueda retrotraer su archivo anterior al desplazamiento especificado antes de aceptar los nuevos datos.

+0

Eso es genial, no sabía que podía reanudar un POST. Déjame ver si lo entendí bien: en el código PHP, agrego este -> encabezado ('Aceptar-Rangos: bytes'); y en Delphi si agrego esto (solo un ejemplo): IdHTTP.Request.CustomHeaders.Add ('Range: bytes = 5000-'); HTTP POST descartará automáticamente los bytes adicionales (retroceso) y la recolección desde el byte 5000, ¿es correcto? – TheDude

+0

Para reanudar un 'POST' anterior, puede pasar un' TStream' que tiene solo los datos restantes. Pero el servidor debe admitir el currículum y anexar los datos nuevos al archivo existente, sin sobrescribir el archivo. La reanudación de carga no es parte del protocolo HTTP estándar. El encabezado de respuesta 'Aceptar rangos' y el encabezado de solicitud' Rango' son solo para ** descargas **, no ** cargas **. Cuando mencioné un encabezado personalizado, me refería a un encabezado 'X -...' personalizado de su propio diseño que su código PHP puede buscar, por ejemplo: 'X-Resuming-From: ...'. –

+0

O el encabezado 'Content-Range', aunque RFC 2616 sugiere que generalmente solo se usa en las respuestas, no en las solicitudes. –

Cuestiones relacionadas