Use solicitações de intervalo para obter os dados do servidor chunk by chunk e enviá-lo de volta ao servidor chunk-by-chunk. Um exemplo do uso de solicitações de intervalo, com base em esta SO pergunta é mostrada abaixo:
var chunkSize = 8388608; // for 8MB segments
function getPartialSegment(fileURL, chunkN, processData, whenError, prevreq){
var xmlhttp = prevreq || new XMLHttpRequest();
xmlhttp.open("GET", fileURL, true);
xmlhttp.setRequestHeader(
"Range",
"bytes=" + (chunkN*chunkSize) + "-" + ((chunkN+1)*chunkSize - 1)
);
xmlhttp.responseType = 'arraybuffer';
xmlhttp.onload = function(){
var response = xmlhttp.response;
if (response && (+xmlhttp.status === 200 || response.length > 0)){
if (response.byteLength%4){
if (!response.transfer){
var responseUint8 = new Uint8Array(response),
tmpDataBuffer=new ArrayBuffer(Math.floor(response.byteLength/4)*4+4),
tmpDataUint8 = new Uint8Array(tmpDataBuffer)
tmpDataUint8.set( responseUint8 );
processData(new Float32Array(tmpDataBuffer), xmlhttp)
} else processData(new Float32Array(ArrayBuffer.transfer(response,
Math.floor(response.byteLength/4)*4+4)),xmlhttp)
} else processData(new Float32Array(response), xmlhttp);
} else if (whenError instanceof Function)
whenError(xmlhttp.status, xmlhttp);
};
xmlhttp.send( null );
};
No entanto, observe que para esse método funcionar, você precisará configurar seus servidores para aceitar solicitações de intervalo. Em seguida, com base nessa outra postagem do SO , você pode obter o tamanho do arquivo remoto. No entanto, isso exigirá que seu servidor defina o cabeçalho content-length
para o tamanho do arquivo. Portanto, juntando tudo em um pequeno analisador, você obtém algo assim (o seguinte fragmento de código é totalmente funcional, exceto que requer o getPartialSegment
acima):
function proccessEntireFileInChunks(fileURL, processData, allDone, whenError){
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("HEAD", fileURL, true);
xmlhttp.onload = function(){
var filelen = parseInt(xmlhttp.getResponseHeader("Content-Length"))
if (xmlhttp.status === 200 || !isNaN(filelen)){
var chunks = Math.ceil(filelen / chunkSize),
chunkN = 0;
if (!chunks) return allDone && allDone();
getPartialSegment(fileURL, chunkN, function nextFile(response){
processData(response, chunkN*chunkSize, filelen, xmlhttp);
if (++chunkN !== chunks){
getPartialSegment(fileURL, chunkN, nextFile, whenError, xmlhttp);
} else return allDone && allDone();
}, whenError, xmlhttp);
} else if (whenError instanceof Function)
whenError(xmlhttp.status, xmlhttp);
};
xmlhttp.send( null );
}
Tendo dito tudo isso, eu só tenho que dizer que se você só vai adicionar os elementos, então vai sobrecarregar o servidor muito menos para adicioná-los no servidor em vez de no cliente. Também estou muito entusiasmado em mover o máximo possível do processamento para o cliente, mas enviar dados por uma rede apenas para adição é muito menos eficiente do que adicioná-los sem enviá-los por uma rede. Eu não ficaria surpreso se internamente, ele adiciona um ponteiro que é usado para ler / gravar todos os bytes nos dados para a solicitação de rede, significando que enviá-lo pela rede para ser adicionado induz 3 adições extras (mínimo absoluto, embora provavelmente mais na realidade) por byte em sua matriz no servidor que poderia ter sido apenas uma única adição por elemento no servidor.