Я пытаюсь ускорить загрузку. Поэтому я попробовал другое решение, как с BackEnd, так и с Front-End. Это:
1) Я загрузил tar-файл (уже сжатый)
2) Я попытался загрузить фрагмент (последовательно), если ответ будет успешным, следующий API будет запущен. На внутренней стороне в том же файле будет добавлен контент.
3) Я пробовал загрузить фрагмент, но параллельно, за один раз, я делаю 50 запросов на загрузку содержимого фрагмента (я знаю, что браузер одновременно обрабатывает только 6 запросов). Со стороны серверной части мы сохраняем все файлы фрагментов отдельно, после получения последнего запроса, добавляя все эти фрагменты в один файл.
Но заметьте, я не вижу большой разницы во всех этих случаях.
Ниже приведен мой служебный файл
export class largeGeneUpload {
chromosomeFile: any;
options: any;
chunkSize = 1200000;
activeConnections = 0;
threadsQuantity = 50;
totalChunkCount = 0;
chunksPosition = 0;
failedChunks = [];
sendNext() {
if (this.activeConnections >= this.threadsQuantity) {
return;
}
if (this.chunksPosition === this.totalChunkCount) {
console.log('all chunks are done');
return;
}
const i = this.chunksPosition;
const url = 'gene/human';
const chunkIndex = i;
const start = chunkIndex * this.chunkSize;
const end = Math.min(start + this.chunkSize, this.chromosomeFile.size);
const currentchunkSize = this.chunkSize * i;
const chunkData = this.chromosomeFile.webkitSlice ? this.chromosomeFile.webkitSlice(start, end) : this.chromosomeFile.slice(start, end);
const fd = new FormData();
const binar = new File([chunkData], this.chromosomeFile.upload.filename);
console.log(binar);
fd.append('file', binar);
fd.append('dzuuid', this.chromosomeFile.upload.uuid);
fd.append('dzchunkindex', chunkIndex.toString());
fd.append('dztotalfilesize', this.chromosomeFile.upload.total);
fd.append('dzchunksize', this.chunkSize.toString());
fd.append('dztotalchunkcount', this.chromosomeFile.upload.totalChunkCount);
fd.append('isCancel', 'false');
fd.append('dzchunkbyteoffset', currentchunkSize.toString());
this.chunksPosition += 1;
this.activeConnections += 1;
this.apiDataService.uploadChunk(url, fd)
.then(() => {
this.activeConnections -= 1;
this.sendNext();
})
.catch((error) => {
this.activeConnections -= 1;
console.log('error here');
// chunksQueue.push(chunkId);
});
this.sendNext();
}
uploadChunk(resrc: string, item) {
return new Promise((resolve, reject) => {
this._http.post(this.baseApiUrl + resrc, item, {
headers: this.headers,
withCredentials: true
}).subscribe(r => {
console.log(r);
resolve();
}, err => {
console.log('err', err);
reject();
});
});
}
Но дело в том, что если я загружу тот же файл на диск Google, это не займет много времени.
Давайте рассмотрим, У меня есть файл размером 700 МБ, чтобы загрузить его на диск Google, потребовалось 3 минуты. Но для загрузки того же файла размером 700 МБ с моим кодом Angular на наш внутренний сервер потребовалось 7 минут, чтобы завершить sh его.
Как повысить производительность загрузки файлов? *