2

編集:問題全体がネットワークの問題であることが判明しましたが、プロセスを最適化する方法についてアイデアがあれば、それでも感謝します。

私はサーブレットにかなり慣れていませんが、旅の途中で、パフォーマンスに関連する問題に遭遇しました。GoogleChromeブラウザのXHRオブジェクトを介してビデオファイルを送信しようとしています。ビデオファイルはBlobオブジェクトに保存されます。JavaScriptスクリプトでこの関数を使用します。

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);
}

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();

ファイルも保存されます。

私が抱えている問題は、それが非常に遅いことです。私の計算によれば、約42kB / sを処理できます。これは、ビデオファイルを処理するWebサービスの場合は非常に遅いです。私は何時間もここに座って、なんとかしてスピードを上げる方法、または少なくともボトルネックを見つける方法を見つけようとしていますが、残念ながらそれがどこにあるのかわかりません。

私の疑いは、ブラウザがラグを引き起こしていることです。サーブレットで別のInputStreamを使用して、ローカルファイル(XHRを介してアップロードしようとしているものと同じもの)を使用しましたが、処理に問題はなく、所要時間も短くなりました。 1秒より。サーバーは私のローカルホストに配置されているので、ネットワークが私にそれほど遅れをとっているとは思いません。

誰かが以前にこの問題を抱えていたなら、私はどんなポインタにも感謝するでしょう。

4

1 に答える 1

2

いくつかのアイデア:

バッファサイズを増やします: おそらく:

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

出力ファイルを頻繁に書き込まないでください。残りのバッファが待機している間、Java は負荷の高い I/O 操作を実行する必要があります。トレードオフは、小さなファイルを扱っている場合、メモリを少し浪費することです。

a を使用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 を呼び出す必要はありません。

また、どのように速度を「計算」しましたか?

于 2013-02-24T21:19:03.613 に答える