10

我正在制作一个处理被拖到应用程序的歌曲的应用程序。当我使用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)
    }
}

编辑

我在 AMD 相当于核心二双核、2.7 GHz、2 gigs 内存、win7 x64。我相信的规格实际上是足够体面的。因此,如果某些事情在我的机器上确实需要足够长的时间,我会认为它是不行的。

这是我的应用程序中主要错误修复的阻止程序。我真的很想在很长一段时间内提供修复程序。我(还)无法设置赏金,也许在设置赏金之前有最短时间。

编辑

我做了一些测试,事实证明,这需要很长时间,因为 chrome计算 大小而不是仅仅从一些元数据中读取它。是测试结果。

文件越大,花费的时间越长,如果第二次调用它会使用一些缓存并且不加载文件。所以现在..我怎样才能减少这个时间?大小是我的应用程序中的一个重要信息,但可能不足以使每个文件的用户上传速度降低约 1.5 秒!我正计划导入库,当添加 100 首左右的歌曲时,它确实有助于减少这个时间。这一次将是应用程序响应时间的一个重大突破。

4

2 回答 2

5

这是一个准受过教育的猜测:

查看HTML5File接口的定义表明 aFile是 aBlob并且size属性实际上是Blob接口的一部分。

由于 aBlob是对原始数据块的抽象,因此访问该size属性实际上可能会导致实现将整个文件加载到内存中。您可以编写一个实验来查看延迟是否随文件大小而变化,或者延迟是否仅发生在第一次读取size属性时。

编辑

我真的觉得这种低效率是浏览器实现File接口的一个问题,但是这里有两个关于如何在将大文件加载到内存时避免延迟的解决方法:

Web workerMDN 参考WHATWG Webapps Standard)将允许您将文件的缓慢加载本质上放到另一个线程中。我认为,这是你最好的选择。

另一种方法是使用接口的方法sliceBlob加载File. 如果实现slice只加载文件的所需部分,它应该会更快。您必须为每个文件加载多个切片,并且需要通过注意Blob返回的大小来检测何时到达文件末尾slice。您将通过取回一个小于您预期的 blob 来检测文件的结尾——来自规范:

如果索引算术超出大小范围,切片方法必须钳制大小值。特别是,这意味着对于给定的切片调用:

如果 start + length > size 则用户代理必须返回一个 Blob 对象,就像调用了 slice(start, size-start) 一样。

如果 start > size 那么用户代理必须返回一个大小为 0 的 Blob 对象

不幸的是,规范还提到了当您请求超出 aBlob的缓冲区大小的切片时引发异常的可能性——在任何这样做的实现上,您必须捕获异常以检测文件结尾。

于 2011-09-09T14:32:14.890 回答
-3

如果你增加在 Console.Time() 下设置的时间,它会给你更多的性能。您需要确保在加载和显示文件之前该时间不会超时。

于 2011-09-08T18:22:26.827 回答