Почему file.size занимает много времени и как сократить время? - PullRequest
10 голосов
/ 07 сентября 2011

Я создаю приложение, которое имеет дело с песнями, перетаскиваемыми в приложение. Когда я использую file.size, чтобы получить размер файла, требуется около 1500 мс (среднее значение), чтобы получить это значение. Есть ли более быстрый способ? Я понимаю, почему это требует времени (и памяти), но, поскольку я новичок в работе с файлами в HTML5, возможно, есть кое-что, чего я не знаю, что может ускорить процесс.

То же самое относится и к API файловой системы. Если я вызову файл через него и вызову file.size, это займет аналогичное время.

PS Я пришел к такому выводу, добавив console.time() в мой код.

Вот код (массово урезанный)

fileSystem.root.getFile(id, {}, function(fileEntry) {
    fileEntry.file(function(audioTemp) {
        console.time(1);
        console.log(audioTemp.size);
        console.timeEnd(1)
    });
});

Это пример API файловой системы. Для этого (очевидно) нужен файл с именем id, чтобы он работал. Ниже приведен код ввода файла D & D

function onChangeAddSongsInput() {
    var files = document.getElementById('addSongsInput').files;
    for(var i=0; i<files.length; i++) {
        console.time(1);
        console.log(files[i].size);
        console.timeEnd(1)
    }
}

EDIT

Я нахожусь на AMD, эквивалентной ядру два дуэта, 2,7 ГГц, 2 гигабайта оперативной памяти, win7 x64. Спецификации, которые я считаю, на самом деле достаточно приличные. Поэтому, если что-то займет достаточно много времени на моей машине, я приму это как запрет.

Это блокировщик для исправления серьезной ошибки в моем приложении. Я действительно хотел бы отправить с исправлением за это долгое время в комплекте. Я не могу установить вознаграждение (пока), может быть, есть минимальное время, прежде чем назначить вознаграждение.

EDIT

Я провел некоторое тестирование, и, как оказалось, это занимает много времени, потому что chrome вычисляет размер, а не просто читает его из некоторых метаданных. Здесь - результат теста.

Чем больше файл, тем дольше он длится, и при повторном вызове он использует некоторый кэш и не загружает файл. Так что теперь .. как я могу сократить это время? Размер - важная информация в моем приложении, но, вероятно, она не настолько важна, чтобы снизить скорость загрузки пользователя примерно на 1,5 секунды для каждого файла! Я планирую импортировать библиотеки, и это действительно поможет сократить это время при добавлении примерно 100 песен. На этот раз будет существенным удар по времени отклика приложения.

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

Вот квази-образованное предположение:

Глядя на определение интерфейса HTML5 File показывает, что File является Blob и что sizeатрибут фактически является частью интерфейса Blob .

Поскольку Blob является абстракцией над необработанным фрагментом данных, доступ к атрибуту size может фактически привести к реализациизагрузить весь файл в память.Вы можете написать эксперимент, чтобы увидеть, зависит ли задержка от размера файла или задержка возникает только при первом чтении атрибута size.

EDIT :

Я действительно чувствую, что эта неэффективность является проблемой с реализацией браузером интерфейса File, но вот две альтернативные идеи о том, как избежать задержки при загрузке больших файлов в память:

Веб-работники ( Ссылка на MDN , WHATWG Webapps Standard ) позволят вам поместить медленную загрузку файлов по существу в другой поток.Это, я думаю, ваш лучший выбор.

Другой подход заключается в использовании slice метода интерфейса Blob для загрузки небольших частей File.Если реализация slice загружает только необходимую часть файла, она должна идти быстрее.Вам нужно будет загрузить несколько фрагментов для каждого файла, и вам нужно будет определить, когда вы дойдете до конца файла, обращая внимание на размер Blob, возвращаемого slice.Вы обнаружите конец файла, вернув блоб, меньший, чем вы ожидали, по спецификации:

Метод среза ДОЛЖЕН ограничивать значения размера, если арифметика индекса превышает границы размера,В частности, это означает, что для данного вызова слайса:

Если start + length> size, пользовательский агент ДОЛЖЕН вернуть объект Blob, как если бы вызывался слайс (start, size-start).

Если start> size, то пользовательский агент ДОЛЖЕН вернуть объект Blob размером 0

К сожалению, в спецификации также упоминается возможность создания исключений, когда вы запрашиваете фрагмент за пределами Blob 'Размер буфера - во всех реализациях, которые это делают, вам нужно будет перехватить исключение, чтобы определить конец файла.

0 голосов
/ 08 сентября 2011

Если вы увеличите время, установленное в Console.Time (), это увеличит производительность. Необходимо убедиться, что это время не истекает, пока файл не загружается и не отображается.

...