2013-03-05 2 views
0

내가 Google 클라우드 스토리지에 저장된 파일에서 바이트를 읽고 HTTP POST 요청에 보내하려고하지만 난 큰 파일, 이 예외를 이동java.lang.OutOfMemoryError와 : Java 힙 공간 - blobstoreService

URLConnection connection = new URL("http://myurl.com/").openConnection(); 
    //set time out to infinite 
    connection.setConnectTimeout(0); 
    connection.setDoOutput(true); 
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 
    BufferedOutputStream writer = null; 
    OutputStream output = connection.getOutputStream(); 
    writer = new BufferedOutputStream(output); // true = autoFlush, important! 

    //........ 

    BlobInfoFactory blobInfoFactory = new BlobInfoFactory(); 
    BlobInfo blobInfo = blobInfoFactory.loadBlobInfo(new BlobKey(video.getBlobkey())); 
    Long blobSize = blobInfo.getSize(); 
    //max read on fetch 
    long maxReadFetch = 1015807; 
    //read the file in one time temporary 
    long i = 0; 
    long start = 0; 
    long end = 0; 
    while(i < blobSize) { 
     start = i; 
     end = i + maxReadFetch; 
     //determine end 
     if(end > blobSize) { 
      end = blobSize; 
     } else { 
      end--; 
     } 
     writer.write(blobstoreService.fetchData(new BlobKey(video.getBlobkey()), start, end)); 

     i += maxReadFetch; 
    } 
    writer.flush(); // Important! Output cannot be closed. Close of writer will close output as well. 
} finally { 
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {} 
} 
:

writer.write(blobstoreService.fetchData(new BlobKey(video.getBlobkey()), start, end)); 

이 내 코드입니다 : 예외가이 선에 throwed됩니다

: 코드는 작은 파일와 협력

스택 트레이스 : 한 번에 1MB 미만을 읽는 경우에도

Uncaught exception from servlet java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2961) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:111) at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection$BufferingOutputStream.write(URLFetchServiceStreamHandler.java:460) at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) at java.io.FilterOutputStream.write(FilterOutputStream.java:97) at controller.CtrlWistia.upload(CtrlWistia.java:200) at controller.CtrlWistia.add(CtrlWistia.java:126) at controller.CtrlWistia.ajax(CtrlWistia.java:79) at controller.CtrlAjax.main(CtrlAjax.java:66) at vidaao.AjaxServlet.doPost(AjaxServlet.java:37) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)

답변

1

주, 당신은 쓰는 당신이 요청을 제출 때까지 메모리에 보관되어있는 OutputStream에, 데이터.

에 따르면 docs :

App Engine's implementation of URLConnection does not maintain a persistent connection with the remote host. When the app sets request data or writes to the output stream, the request data is kept in memory. When the app accesses any data about the response, such as getting the input stream (or calling the connect() method), App Engine calls the URL Fetch service with the request data, gets the response, closes the connection and returns the response data.

+0

확인 아 ...이 전에 데이터를 전송하는 모든 솔루션을해야합니까? –

+0

해당 공급자에 따라 다릅니다. S3에 대한 대답은 다음과 같습니다. http://stackoverflow.com/questions/8495167/how-to-upload-file-to-s3-from-gae-a-horror-story –

+0

오케이 아니요. 내 공급자가 이것을 받아들이지 않을 것입니다. .. 그렇게 나쁘게 나는 완전히 다른 접근법을 시도해야한다. 도와 줘서 고마워. –

관련 문제