2013-02-24 2 views
2

EDIT : 전체적인 문제는 네트워크 문제로 판명되었지만 프로세스를 최적화 할 수있는 방법에 대한 아이디어가 있으면 고맙겠습니다.ajax를 통해 서블릿에 BLOB 보내기

저는 서블릿에 상당히 익숙하지 않으며 성능에 관련된 문제가 발생했습니다. 내 Chrome 브라우저에서 XHR 객체를 통해 동영상 파일을 보내려고합니다. 비디오 파일은 Blob 객체에 저장됩니다.

byte[] buffer = new byte[16 * 1024]; 

InputStream input = request.getInputStream();  
OutputStream output = new FileOutputStream("costam0.webm"); 
int bytesRead; 
while ((bytesRead = input.read(buffer)) != -1){ 
    System.out.println(bytesRead); 
    output.write(buffer, 0, bytesRead); 
} 
output.close(); 
input.close(); 

그것은뿐만 아니라 파일을 저장합니다 : 블롭 내가 그것을 처리하는 코드의이 비트를 사용하는 서블릿에 도달하기 때문에, 그것은 잘 작동

function upload(blob) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', '/Test/Odbieracz', true); 
    xhr.onload = function(e) { console.log("loaded"); }; 
    xhr.onreadystatechange = function(){ 
     console.log("state: " + xhr.readyState); 
    }; 
    // Listen to the upload progress. 
    xhr.upload.onprogress = function(e) { console.log("uploading..."); }; 
    xhr.setRequestHeader("Content-Type", "video/webm"); 
    xhr.send(blob); 
} 

: 내 자바 스크립트 스크립트에서이 기능을 사용 .

내가 겪어야 할 문제는 비디오 파일과 관련이있는 웹 서비스의 경우 매우 느린 약 42kB/s를 처리 할 수있는 계산에 따르면 매우 느리다는 것입니다. 저는 어떻게 든 속도를 높이거나 적어도 병목 현상을 발견하는 방법을 찾기 위해 수 시간 동안 여기에 앉아 있었지만 불행히도 그것이 어디 있는지 알지 못합니다.

내 의심은 브라우저가 지연을 일으키고 있다는 것입니다. 내 서블릿에서 로컬 파일 (XHR을 통해 업로드하려고 시도하는 동일한 파일)로 이어지는 다른 InputStream을 사용했으며 처리시 문제가 없었습니다. 모두 1 초도 채 걸리지 않았습니다. 서버가 로컬 호스트에 위치하므로 네트워크가 전혀 뒤떨어져 있다고 생각하지 않습니다.

누구든지 이전에이 문제가 발생했다면 어떤 포인터에 대해서도 감사 할 것입니다.

답변

2

몇 가지 아이디어 :

증가 버퍼 크기 : 아마도 :

byte[] buffer = new byte[1024 * 1024]; 

가 자주 출력 파일을 작성하지 마십시오. Java는 값 비싼 I/O 조작을 수행해야하며 나머지 버퍼는 대기 중입니다. 단점은 작은 파일을 다루는 경우 약간의 메모리를 낭비한다는 것입니다.

BufferedOutputStream : 위와 같은 이유. 매우 큰 파일을 쓸 때는 BufferedOutputStream을 사용하는 것이 좋습니다. 각 루프 중에 작성하는 것에 대해 걱정할 필요가 없습니다. 루프가 완료된 후 buffOut.flush()를 호출하여 단일 쓰기를 작성하기 만하면됩니다. 예 :

BufferedOutputStream buffOut = new BufferedOutputStream(new FileOutputStream("costam0.webm"));  
int bytesRead; 
while ((bytesRead = input.read(buffer)) != -1){ 
    System.out.println(bytesRead); 
    output.write(buffer, 0, bytesRead); 
} 
buffOUt.flush() 

println을 호출하는 동안 계산을 계산 했습니까? 그러지 마. 당신은 과정이 효과가 있다는 것을 확인했습니다. 단지 느립니다. 매번 println을 호출 할 필요가 없습니다.

어떻게 속도를 "계산 했습니까"?

+0

답장을 보내 주셔서 감사합니다.하지만 결국 네트워크 문제로 판명났습니다. 모뎀을 다시 시작 했으므로 모두 좋습니다. 나는 당신의 팁을 사용하여 더 효율적으로 만들 것이다. 속도를 계산하는 방법은 요청의 시작과 끝에서 타임 스탬프를 사용하는 것이 었습니다. 기본적으로 파일의 크기를 초 단위로 나누었습니다. – STT

관련 문제