Почему «file.size» занимает много времени и как сократить время?

StackOverflow https://stackoverflow.com/questions/7325795

Вопрос

Я делаю приложение, которое касается песен, перетаскиваемых в приложение. Когда я использую file.size Чтобы получить размер файла, требуется около 1500 мс (AVG), чтобы получить это значение. Есть ли более быстрый путь? Я понимаю, почему это требует времени (и памяти), но, поскольку я новичок в работе с файлами в 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)
    }
}

РЕДАКТИРОВАТЬ

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

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

РЕДАКТИРОВАТЬ

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

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

Это было полезно?

Решение

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

Метод срезов должен зажать на значения размера, если арифметика индекса превышает границы размера. В частности, это означает, что для данного вызова среза:

Если start + length> размер, тогда был вызван пользовательский агент.

Если запуск> размер, то пользовательский агент должен вернуть объект Blob Size 0

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top