2016-12-08 14 views
0

Я пытаюсь использовать FineUploader для загрузки большого количества файлов. Мне также нужно манипулировать файлами перед их загрузкой - а именно, мне нужно анонимизировать некоторую идентифицирующую информацию. В another answer, Ray Nicholus предложил отклонить исходный файл в обработчике onSubmit, а затем повторно добавить управляемый файл. Поэтому мой обработчик onSubmit выглядит так:Высокое использование памяти при загрузке и обработке большого количества файлов

onSubmit: function (id, name) 
{ 
    var file = this.getFile(id) 
    if (file.isAnonymized) 
    { 
     return; 
    } 
    var reader = new FileReader() 
    reader.onload = function() 
    { 
     var arrayBuffer = this.result 
     var byteArray = new Uint8Array(arrayBuffer) 
     // Manipulate the byteArray in some way... 
     var blob = new window.Blob([byteArray]) 
     blob.isAnonymized = true 
     // add the anonymized file instead 
     uploader.addFiles({blob: blob, name: name}) 
    } 
    reader.readAsArrayBuffer(file) 
    // cancel the original file 
    return false 
}, 

Это прекрасно работает для небольшого количества файлов. В конкретном примере клиент попытался загрузить ~ 1.500 файлов по 3 МБ в Firefox и увидел, что использование памяти в Firefox пробило крышу, прежде чем вкладка в конечном итоге потерпела крах. Другие браузеры (Chrome, Edge) демонстрируют подобное поведение. Использование инструментов разработчика браузера, похоже, не показывает больших объемов памяти. Нет проблем при простой загрузке файлов как есть, но это не вариант.

+0

Вы можете подумать о том, чтобы поместить его в WebWorker. – TryingToImprove

+0

Некоторые библиотеки файлов js не предназначены для управления большим количеством файлов. XMLHttpRequest - это огромный и асинхронный объект. Обычно такая библиотека запускает все закачки в цикле for, который висит в браузере, когда вы помещаете более ~ 1000 файлов (поскольку он выделяет и пытается запустить 1000 одновременных подключений). Я предлагаю вам написать свою собственную часть загрузки. – Fefux

+0

Как я уже сказал, просто загрузка работает как шарм, поэтому я уверен, что это не проблема. Это когда мне нужно заранее манипулировать файлами, чтобы начать боль. –

ответ

0

Я немного очистил пример от https://github.com/sgarcialaguna-mms/file-upload-memory/ и теперь уверен, что ошибка связана с тем, что библиотека fineuploader держится до blobs дольше, чем необходимо.

Пример теперь загружает один файл в память за раз, затем передает blob в библиотеку загрузки. Я также теперь использую фактический сервер (пример Django из репозитория примеров-экземпляров fineuploader).

С Firefox, когда я перетаскиваю файлы размером ~ 1 ГБ, использование памяти Firefox неуклонно растет во время загрузки и остается высоким даже после завершения загрузки. Я могу открыть примерно: память, нажмите «Свести к минимуму использование памяти», чтобы вызвать сборку мусора, нажмите «Измерение», и данные файла отображаются в разделе «memory-file-data/large». Вызовите uploader.reset(), снова запустите сборку мусора, и использование памяти Firefox резко снизится. Измерение снова показывает, что объекты «memory-file-data/large» больше не присутствуют в памяти. Согласно https://github.com/FineUploader/fine-uploader/issues/1540#issuecomment-194201646, вызывая this._handler.expunge(id) после каждой загрузки, также.

Хром ведет себя по-другому, из-за давней ошибки, которая в конечном итоге начинает метать ошибки ERR_FILE_NOT_FOUND, когда накапливается более 500 МБ данных blob. Страница chrome: // blob-internals показывает, какие капли сохраняются, а также их refcount.

Я не знаю, есть ли простой способ определить, какая переменная/закрытие/что-то удерживает эти объекты, но это очень помогло бы.

+0

Файлы не потребляют память, они поддерживаются диском. Удержание этих файлов не будет потреблять память. Однако, если вы проходите в Blobs, которые не поддерживаются файлами на диске, это совсем другая история. Я не знаю ни одной области, где Fine Uploader будет удерживать эти капли дольше, чем это необходимо. Чтобы быть уверенным, что это так, необходимо будет изучить код и указать, где находится проблема, нужно будет открыть. –

+0

Скорее всего, проблема в вашем коде. Если вы передаете 1 ГБ памяти Blobs в Fine Uploader, конечно, это будет потреблять 1 ГБ памяти, а капли должны оставаться в области действия до тех пор, пока они не будут загружены. –

+0

Хорошо, последний комментарий от меня, так как у меня не будет доступа в интернет до конца года. @RayNicholus «Скорее всего, проблема в вашем коде. Если вы передаете 1 Гбайт Blobs с поддержкой памяти в Fine Uploader, конечно, это будет потреблять 1 ГБ памяти, а капли должны оставаться в области действия до тех пор, пока они не будут были загружены ". Это очевидно. Как я четко заявил, проблема в том, что память не выдается после загрузки. «Скорее всего, проблема в вашем коде». Мой код прямо здесь. Это всего лишь 60 строк. Если вы заметите ошибку, которую я совершил, я буду рад ее услышать. –