我正在开发一款可以处理被拖到应用中的歌曲的应用。当我使用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 GB的ram,win7 x64。我相信的规格实际上还算不错。因此,如果某些东西在我的机器上需要足够长的时间,我将把它视为禁忌。
这是我的应用中的主要错误修复的阻止程序。我真的很想包括这个很长一段时间的修复程序。我不能设置赏金(但)可能在设定赏金之前有最短的时间。
修改
我做了一些测试,事实证明,它需要很长时间,因为chrome 计算大小而不是仅仅从一些元数据中读取它。 Here是测试结果。
文件越大,花费的时间越长,如果第二次调用它就会使用一些缓存并且不加载文件。所以现在..我怎么能减少这个时间?大小是我的应用程序中的一个重要信息,但可能不足以使用户的上传速度降低大约1.5秒的每个文件!我正计划导入库,当添加100首左右的歌曲时,这将有助于减少这段时间。这一次将成为应用响应时间的重大突破。
答案 0 :(得分:5)
这是一个准教育的猜测:
查看the definition of the HTML5 File
interface表示File
是Blob
,而size
属性实际上是Blob
interface的一部分。
由于Blob
是对原始数据块的抽象,因此访问size
属性实际上可能会导致实现将整个文件加载到内存中。您可以编写一个实验来查看延迟是否随文件大小而变化,或者延迟是否仅在第一次读取size
属性时发生。
修改:
我觉得这种低效率是浏览器实现File
接口的问题,但这里有两个解决方法,关于如何在将大文件加载到内存时避免延迟:
网络工作者(MDN reference,WHATWG Webapps Standard)允许您将文件的缓慢加载基本上放到另一个线程中。我认为这是你最好的选择。
另一种方法是使用Blob
界面的slice
method来加载File
的一小部分。如果slice
的实现仅加载文件的所需部分,则应该更快。您必须为每个文件加载多个切片,并且您需要通过关注Blob
返回的slice
的大小来检测何时到达文件末尾。您将通过从规范中获取小于预期的blob来检测文件的结尾:
如果索引算法超出大小范围,则切片方法必须钳制大小值。特别是,这意味着对于给定的切片调用:
如果开始+长度&gt; size然后用户代理必须返回一个Blob对象,就像调用了slice(start,size-start)一样。
如果开始&gt;大小然后用户代理必须返回大小为0的Blob对象
不幸的是,该规范还提到了在请求Blob
缓冲区大小之外的切片时抛出异常的可能性 - 在任何执行此操作的实现上,您必须捕获异常以检测文件的结尾。
答案 1 :(得分:-3)
如果增加在Console.Time()下设置的时间,它将为您提供更多性能。在文件加载和显示之前,您需要确保此时间没有超时。