5

私は、NFS共有でホストされている可能性のあるいくつかの非常に大きなファイル(1GB以上、20GB未満)にアクセスするために最終的にアプリサーバー内で使用されるJavaコードに取り組んでいます。個々のリクエストの処理には、次の操作が含まれます。

  1. 読む必要のある大きなファイルを探す
  2. そのファイル内のランダムなポイントに移動します
  3. そのファイルからバイトを読み取ります(通常は1MB未満)
  4. それらのバイトを返す

新しい読み取り専用ファイルを開いて閉じるだけの、幸せな単純なPOCコードがあります。

RandomAccessFile raf=new RandomAccessFile(myFileName, "r");
try{
   byte[] buffer = new byte[size];
   raf.seek(position);
   raf.reafFully(buffer);
   return buffer;
}
finally{
   raf.close();
}

これが本当にうまく機能するはずのエレガントでシンプルなアプローチなのか、それとも高負荷で多くの問題が発生する愚かな単純なアプローチなのか(そしておそらくスレッドセーフなリーダーのプールを作成する必要があるのか​​など)疑問に思います。明らかに、その仮定をテストするのが最善ですが、どちらのアプローチにもベストプラクティスや既知の問題があるかどうか疑問に思いました。これまでのところ、私はあまりグーグルを理解することができませんでした...

ありがとう!

PS。これの最終バージョンがWindowsでホストされるのか*nixでホストされるのかはまだ明確ではありません。また、大きなファイルがどのように共有されるかは明確ではありません。PPS。アプリサーバーはクラスター内で構成されている可能性が高いため、2つの異なるアプリサーバーが同じ大きな共有ファイルを同時に読み取る必要がある場合があります。

4

1 に答える 1

2

もう1つのオプションは、Java NIO、つまりFileChannelです。FileChannelもナビゲート可能であり、いわゆるダイレクトバッファーで動作できるため、RandomAccessFileよりも高速である可能性があります。それはいくつかのより興味深い機能を持っています、例えばそれは割り込み可能です。

于 2012-11-29T15:54:48.910 に答える