2017-09-21 3 views
0

로컬 바이너리 파일을 UInt8Array에 빨리 읽는 방법. 아래 코드에서자바 스크립트가 로컬 파일을 UInt8Array에 빨리 읽음

function readAllBytesAsUInt8Array(path) { 
    var req = new XMLHttpRequest(); 
    req.open("GET", path, false); 
    req.overrideMimeType("text/plain; charset=binary-data"); 
    req.send(null); 
    if (req.status !== 200) { 
     console.log("error"); 
     return null; 
    } 
    var text = req.responseText; 
    var resultArray = new Uint8Array(text.length); 
    for(var i = 0; i < text.length;i++){ 
    resultArray[i] = (text[i].charCodeAt() & 255) & 255; 
    } 
    return resultArray.buffer; 
} 

var text = req.responseText;

var resultArray = new Uint8Array(text.length); 
for(var i = 0; i < text.length;i++){ 
    resultArray[i] = (text[i].charCodeAt() & 255) & 255; 
} 

바이너리 파일 50MB의에 대한 10 초 주위에 걸리는 두 번째, 그 사이에이 부분보다 적은 실행, 빠르게 UInt8Array에 바이너리 파일을 읽을 수있는 방법이 있나요 ?

+0

궁금한 점이 있으시면'var resultArray = new Uint8Array (text.length);'가 정말로 필요합니다. ? 자바 스크립트는 배열 크기를 미리 정의 할 것을 요구하지 않습니다. 그냥'resultArray = [];'라고 말하고 채우 듯이 채우십시오. – Dellirium

+0

왜 XMLHttpRequest()의'.responseType'을''arraybuffer''로 설정하지 않습니까? – guest271314

+1

배열마다 매번 누를 때마다 더 느려질 것입니다. – user818117

답변

0

TextEncoder! TextEncoder는 코드 포인트 스트림을 입력으로 가져 와서 바이트 스트림을 방출합니다.

여기에 새로운 코드 :

function readAllBytesAsUInt8Array(path) { 
    var req = new XMLHttpRequest(); 
    req.open("GET", path, false); 
    req.overrideMimeType("text/plain; charset=binary-data"); 
    req.send(null); 
    if (req.status !== 200) { 
     console.log("error"); 
     return null; 
    } 
    var text = req.responseText; 
    var encoder = new TextEncoder("utf-8"); 
    var resultArray = encoder.encode(text); 
    return resultArray.buffer; 
} 

작품을, 훨씬 빨리 어떻게해야 참조입니다.

+0

textencoder는 IE, Safari와 같은 일부 브라우저에서는 작동하지 않지만 위의 코드와 비슷한 성능을 테스트했습니다. – user818117

1

그런 다음, "arraybuffer"XMLHttpRequest().responseType을 설정 new Uint8Array()ArrayBuffer 인스턴스를 전달할 수 있습니다. 또는 ArrayBuffer을 복사하지 않고 fetch()Response.arrayBuffer() 또는 FileReaderSync()Worker 내에서 ArrayBuffer을 주 스레드로 전송할 수 있습니다.

req.responseType = "arraybuffer"; 
let buffer = req.response; 
let u = new Uint8Array(buffer); 
+0

은'req.response' 및 '(새 Uint8Array (버퍼)). 버퍼 '같은 것입니까? 메소드가'return resultArray.buffer; '를 반환 할 때 – user818117

+0

네,'req.response'는'ArrayBuffer'입니다. – guest271314

+0

let u = new Uint8Array (buffer); Uint8Array()는 첫 번째 인수의 길이가 – user818117

관련 문제