Я пытаюсь получить доступ к первым нескольким строкам текстовых файлов с помощью FileApi в JavaScript.
Для этого я нарезаю произвольное количество байтов от начала файла и передаю большой двоичный объект FileReader.
Для больших файлов это занимает очень много времени, хотя, насколько я понимаю, требуется доступ только к первым нескольким байтам файла. Есть ли какая-то реализация в фоновом режиме, которая требует доступа ко всему файлу, прежде чем его можно будет разрезать? Зависит ли это от реализации FileApi в браузере? В настоящее время я тестировал как Chrome, так и Edge (хром).
Анализ в Chrome с использованием инструментов разработки производительности показывает, что перед читателем отключается загрузка и не увеличивается использование оперативной памяти. Однако это может быть связано с тем, что FileApi реализован в самом браузере и не отражается в статистике производительности JavaScript.
Моя реализация FileReader выглядит примерно так:
const reader = new FileReader();
reader.onloadend = (evt) => {
if (evt.target.readyState == FileReader.DONE) {
console.log(evt.target.result.toString());
}
};
// Slice first 10240 bytes of the file
var blob = files.item(0).slice(0, 1024 * 10);
// Start reading the sliced blob
reader.readAsBinaryString(blob);
Он работает нормально, но, как описано, работает не очень хорошо для больших файлов. Я пробовал на 10кб, 100мб и 6гб. Время до регистрации первых 10 Кбайт, по-видимому, напрямую коррелирует с размером файла.
Есть ли у вас какие-либо предложения по повышению производительности чтения начала файла?
Изменить: использование потоков Response и DOM, предложенных @BenjaminGruenbaum, к сожалению, не улучшает производительность чтения.
var dest = newWritableStream({
write(str) {
console.log(str);
},
});
var blob = files.item(0).slice(0, 1024 * 10);
(blob.stream ? blob.stream() : newResponse(blob).body)
// Decode the binary-encoded response to string
.pipeThrough(newTextDecoderStream())
.pipeTo(dest)
.then(() => {
console.log('done');
});
Response
и потоков DOM? Я не уверен, почемуreadAsBinarySring
здесь медленный, поскольку использование.slice
в большом двоичном объекте должно читать только ту часть, которую вы хотите, однако то, что вы описываете, указывает на то, что действительно он ждет всего файла. - person Benjamin Gruenbaum   schedule 17.02.2021new Blob([await file.arrayBuffer()])
)? Браузеры должны делать снимок файла при первом доступе, но я думаю, что обычно для этого используется только поле lastModified, хотя вашей ОС также может потребоваться больше времени для доступа к метаданным файла для больших файлов. - person Kaiido   schedule 23.02.2021onchange
вызывается только после того, как произошла некоторая файловая операция, и эта файловая операция увеличивается с размером файла. Время между добавлением файла и запуском события onchange зависит от размера файла. - person kacase   schedule 24.02.2021input
типа File. Я проведу дополнительное тестирование и обновлю его соответственно. - person kacase   schedule 24.02.2021