2016-04-05 16 views
0

Spark frameworkを使用して大きなファイルをWebアプリケーションにアップロードしようとしていますが、メモリ不足エラーが発生しています。スパークがリクエストボディをメモリにキャッシュしているようです。ディスク上にファイルアップロードをキャッシュするか、リクエストをストリームとして読み込むかのどちらかです。大きなファイルをSparkフレームワークでアップロードする

Apache Commons FileUploadのを使用しようとしましたが、request.raw()。getInputStream()を呼び出すと、Sparkが本文全体をメモリに読み込み、そのメモリチャンクのInputStreamビューを返し、 this codeによって行われるように。ファイル内のコメントに基づいて、getInputStreamを複数回呼び出すことができるようになります。この動作を変更する方法はありますか?

答えて

0

短い回答は私には分かりません。

SparkServerFactoryは、InputStreamをメモリに処理するよりも、プライベート静的クラスHttpRequestWrapperを持つJettyHandlerを構築します。

静的なものは、利用可能な延長を意味しません。

0

私は最近、同じ問題を抱えていました。キャッシングを回避できるとわかりました。私は次の関数でそう:これはスパーク2.4でテストされてい

public ServletInputStream getInputStream(Request request) throws IOException { 
    final HttpServletRequest raw = request.raw(); 
    if (raw instanceof ServletRequestWrapper) { 
     return ((ServletRequestWrapper) raw).getRequest().getInputStream(); 
    } 

    return raw.getInputStream(); 
} 

私はSparkの内部の仕組みに精通していないので、この機能を使用した場合、マイナーな欠点は、キャッシュされたInputStreamを取得したかどうかわからないことです。キャッシュされたバージョンは再利用可能です。そうではありません。

public boolean hasCachedInputStream(Request request) { 
    return !(raw instanceof ServletRequestWrapper); 
} 

は、私は次のような機能を実装することができたとし、この欠点を回避するために、
関連する問題