私はアプリケーションサーバー内で実際に大きなファイル(1GB以上、20GB未満)にアクセスするために最終的に使用されるいくつかのJavaコードに取り組んでいます。シェア。個々のリクエストにサービスを提供することはこれをやって関与します:java.io.RandomAccessFileスケーラビリティ(またはその他のオプション)
- は、私がそのファイルにランダムな点まで(通常は1メガバイトの下で)、そのファイルから
- 読むバイト
- を
- 移動を読む必要は大きなファイルを探しますそれらのバイト
を返し、私は単に新しい読み取り専用ファイルを開き、それを閉じた瞬間に、いくつかの幸せな簡単な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つの異なるアプリケーションサーバーが同じ大規模な共有ファイルを同時に読み取る必要があります。
は私にうまく見えます。ファイルをローカルディスクやメモリにキャッシュしない限り、それ以上の速度を得ることはできません。 – irreputable
ファイルハンドルのオープンとリリースのコストはごくわずかですか?例えば、NFSシェアであっても? – Dave
ローカルファイルでさえ無視できないでしょう。懸念がある場合は、ハンドルをプールすることができます。または、1つの 'FileChannel'を開いたままにして、' read(dst、position) 'によって同時に読み込みます。 – irreputable