java - tag - programar etiquetas nfc
HttpURLConnection buffering en lugar de transmisión, a pesar de configurar el modo de transmisión fragmentada? (0)
Estoy utilizando HttpURLConnection
para escribir archivos, algunos de los cuales son bastante grandes, en un servidor.
final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
Hace un tiempo tuve problemas para escribir objetos de 1 GB o más. Lo arreglé configurándolo para transmitir un tamaño de fragmento más manejable.
final int bufferSize = 1024 * 1024;
[...]
conn.setChunkedStreamingMode(bufferSize);
Entonces funcionaba bien en mi computadora portátil, pero en otras máquinas se estaba estrellando. En la investigación, descubrí que la causa era un error de memoria insuficiente que se producía al escribir en la secuencia de salida.
final OutputStream out = conn.getOutputStream();
final long bytesWritten = IOUtils.copyLarge(in, out);
Dentro de la rutina copyLarge, encontré que era capaz de hacer 262145 iteraciones de 4096 bytes, fallando cuando intentaba cruzar la línea de 1 GB. Asignar más memoria a la aplicación java parecía evitar esos bloqueos, pero pensé que eso no debería ser necesario. Si está escribiendo fragmentos de 1 MB, debería fallar con muchas menos iteraciones o escribir repetidamente 1 MB sin problema.
ACTUALIZACIÓN: Resulta que la configuración de la línea ChunkedStreamingMode no se estaba llamando en algunas máquinas. Si no establece el modo de transmisión fija / fragmentada, HttpURLConnection solo enviará todo a PosterOutputStream / ByteArrayOutputStream.