Javascript 使用HTML5从CD读取文件,webkitdirectory比读取本地文件花费更多时间

Javascript 使用HTML5从CD读取文件,webkitdirectory比读取本地文件花费更多时间,javascript,webkit,cd,html5-filesystem,Javascript,Webkit,Cd,Html5 Filesystem,我有一个web应用程序,允许用户将DICOM和非DICOM文件上载到他们的帐户。我正在使用JavaScript、HTML5、Webkitdirectory、Chrome和Datatable在UI上填充选定的文件。我面对的问题是: 当从本地计算机选择文件时,下面的代码似乎运行得非常快,所选文件会立即在UI上填充,但当从CD中选择相同数量的文件时,在UI上渲染需要时间。以下是一个例子- 对于包含20个DICOM+2个非DICOM研究以及大约2241个图像的CD,第一次填充列表大约需要5-6分钟 在用

我有一个web应用程序,允许用户将DICOM和非DICOM文件上载到他们的帐户。我正在使用JavaScriptHTML5WebkitdirectoryChromeDatatable在UI上填充选定的文件。我面对的问题是:

当从本地计算机选择文件时,下面的代码似乎运行得非常快,所选文件会立即在UI上填充,但当从CD中选择相同数量的文件时,在UI上渲染需要时间。以下是一个例子-

对于包含20个DICOM+2个非DICOM研究以及大约2241个图像的CD,第一次填充列表大约需要5-6分钟 在用户界面上。如果我尝试选择相同的CD文件夹,列表将填充到 大约60秒,如果在同一时间之前填充过一次 会议

但是如果我使用来自本地机器的同一组文件,那么在UI上填充大约需要6-7秒

这是我为每个DICOM文件执行的代码-

var fileReader = new FileReader();
fileReader.onload = function(evt){
    console.log("Completed Reading");
    var arrayBuffer = fileReader.result;

    var byteArray = new Uint8Array(arrayBuffer);
    _parseDicom(byteArray);
    try {
        if (fileReader.readyState !== 2) {
            fileReader.abort();
        }
    }
    catch (err) {
        console.log('error occured: '+err);
    }
}
var blob = f.slice(0, 50000);
console.log("Starting to Read");
fileReader.readAsArrayBuffer(blob);
在分析了我提出的问题之后

  • 我想最基本的一点是,操作系统需要时间将CD装入内存,因为它是一个外部驱动器如果我们第二次访问,需要的时间会更少,因为CD内容已经装入

  • 从CD读取文件时,从“开始读取”到“完成读取”之间的时间相对比从本地机器读取文件的时间多

  • 我还试着查找DICOMDIR文件,它是光盘上包含的所有研究文件的索引,包含它的原因正是:避免长时间扫描光盘。但是我没有找到用JavaScript解析DICOMDIR文件的任何标准或方法

有没有办法减少从CD读取文件所需的时间

更新-

我现在可以使用dicomParser将DICOMDIR文件结构转换为JavaScript-

对象的结构类似于显示在-
当我们上传任何DICOMDIR文件时

这里的问题是我无法同时收集所有患者研究系列图像。我找到的唯一解决方案是反复检查它是否是患者研究系列图像对象


有没有更好的检索方法/标准???

您可以回答自己的问题:只需阅读DICOMDIR即可。DICOMDIR遵循相同的DICOM标准,因此您可以使用任何DICOM库读取它。我确实尝试使用相同的DICOM库进行解析。使用
fileReader.readAsArrayBuffer(blob)
我们得到一个空的
fr.result()
如果我们使用
fileReader.readAsText(blob)我们得到二进制字符?是的,是同一个。真倒霉!您可能希望将此报告为错误上游:。您是否至少可以使用第三方工具(例如gdcmdump DICOMDIR)检查此文件的内容。
var fr = new FileReader();
fr.onload = function(evt){
    var byteArray = new Uint8Array(fr.result);
    try {
        var dataSet = dicomParser.parseDicom(byteArray);
        _searchDicom(dataSet, f);
    } catch (err) {
        if (typeof err.dataSet != 'undefined') {
            _searchDicom(err.dataSet, f);
        }
    }
}
var blob = f.slice(0, 1000000); 
fr.readAsArrayBuffer(blob);

function _searchDicom(dataset,f) {
    var data = dataset.elements.x00041220.items;
    if(data) {
    data.forEach(function (e) {
        if (e.dataSet.string('x00041430') === 'PATIENT') {
            console.log("Patient Name - "+e.dataSet.string('x00100010'));
        }
        else if (e.dataSet.string('x00041430') === 'STUDY') {}
        else if (e.dataSet.string('x00041430') === 'SERIES') {}
        else if (e.dataSet.string('x00041430') === 'IMAGE') {}              
    });
    }
}