2011-05-22 12 views
8

Escribí Java Downloader y tengo algunos problemas con la velocidad.Por qué la velocidad de descarga de archivos usando Java es tan baja

Al principio, la velocidad está bien, al igual que cuando uso mi navegador para descargar este archivo. Pero después de un tiempo, la velocidad disminuye mucho y cambia cada dos segundos: de 42 kb/s a ​​64 kb/s y de 64 kb/s a ​​42 kb/s.

Mi código:

InputStream is = null; 
FileOutputStream os = null; 
os = new FileOutputStream(...); 
URL u = new URL(...); 
URLConnection uc = u.openConnection(); 
is = uc.getInputStream(); 
final byte[] buf = new byte[1024]; 
for(int count = is.read(buf);count != -1;count = is.read(buf)) { 
    os.write(buf, 0, count); 
} 

¿Qué debo hacer para maximalise velocidad de descarga?

ACTUALIZACIÓN

Los tamaños de los archivos son diferentes de 1 a alrededor de 100 MB. Aumenté el buffer a 65536 para que sea el mismo.

sobre la medición: puedo comprobar cada 3 segundos la cantidad de bytes que estaba escrito, y luego se divide por 3 y por 1024 - me da kb/s

+4

¿Cómo mide su velocidad de descarga? ¿Y cuál es la velocidad que estás esperando? – coobird

+0

¿Qué tan grande es su archivo? –

+0

Eso significa medir los sonidos, ya que se basa en el sistema de archivos que informa en tiempo real * exactamente * cuántos bytes se han escrito en el archivo, p. Ej. en respuesta a un comando 'ls' o' dir'. Me decantaría por un enfoque más directo solo para eliminar las incertidumbres y agregar instrumentos al código. –

Respuesta

5

Para aumentar la velocidad, hasta el límite de su ancho de banda y capacidad del servidor, una aplicación debe usar varias conexiones (más de una) con código de subprocesos múltiples: cada subproceso crea su propia conexión y consulta por partes del archivo.

Un ejemplo de una aplicación de este tipo es IBM download director que a menudo utiliza tres conexiones HTTP para recuperar archivos de gran tamaño. La mayoría de los clientes FTP también pueden trabajar con múltiples conexiones para aumentar el rendimiento. En Java, Apache HttpClient se puede usar para escribir una aplicación de subprocesos múltiples.

No ha detallado el protocolo utilizado en su URL. Si HTTP, una solicitud HEAD devuelve la longitud del archivo y GET con soporte de fragmentación se utiliza para consultar partes de archivos.

Probablemente puede obtener un mejor rendimiento incluso con una sola conexión si utiliza directamente HttpURLConnection y establece el valor para ChunkedStreamingMode.

Si todavía no satisfecha, facilite detalles adicionales:

  • lo que su "Pero después de un tiempo" significa, ¿verdad descargar todos los archivos en la secuencia?
  • ¿cuál es el protocolo? usas un URLStreamHandler específico?
  • ¿Ha comprobado su memoria JVM y el uso de la recolección de basura?
  • su estación de trabajo puede estar ocupada haciendo otra cosa: CPU utilizada, ancho de banda de red utilizado por otra cosa, antivirus ralentizando el acceso al disco?
  • qué se pasa a través de un proxy: algunos proxy HTTP puede reducir el ancho de banda después de algunos minutos en la misma conexión ...
Cuestiones relacionadas