2012-11-29 10 views
5

私はアプリケーションサーバー内で実際に大きなファイル(1GB以上、20GB未満)にアクセスするために最終的に使用されるいくつかのJavaコードに取り組んでいます。シェア。個々のリクエストにサービスを提供することはこれをやって関与します:java.io.RandomAccessFileスケーラビリティ(またはその他のオプション)

  1. は、私がそのファイルにランダムな点まで(通常は1メガバイトの下で)、そのファイルから
  2. 読むバイト
  3. 移動を読む必要は大きなファイルを探しますそれらのバイト

を返し、私は単に新しい読み取り専用ファイルを開き、それを閉じた瞬間に、いくつかの幸せな簡単な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つの異なるアプリケーションサーバーが同じ大規模な共有ファイルを同時に読み取る必要があります。

+1

は私にうまく見えます。ファイルをローカルディスクやメモリにキャッシュしない限り、それ以上の速度を得ることはできません。 – irreputable

+0

ファイルハンドルのオープンとリリースのコストはごくわずかですか?例えば、NFSシェアであっても? – Dave

+0

ローカルファイルでさえ無視できないでしょう。懸念がある場合は、ハンドルをプールすることができます。または、1つの 'FileChannel'を開いたままにして、' read(dst、position) 'によって同時に読み込みます。 – irreputable

答えて

2

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

+0

良い呼び出しです。ええ、私はそれらでテストしました。これは無視できるほど早いと思われますが、この特定のユースケースの複雑さを必ずしも保証するのに十分な速さではありません。私は実際に別のアプリのJVMで物理的なWindowsのメモリリークが原因でnioによって焼損してしまったので、それ以来それを使用するのは少し躊躇してきました。 ランダムアクセスアプローチがシングルスレッドテストと同様に負荷の下で実行される場合、それは私にとって完璧です。 – Dave

+0

まだ、まだチェックしていない場合はまだチェックしてください。http://stackoverflow.com/questions/1605332/java-nio-filechannel-versus-fileoutputstream-performance-usefulness –

関連する問題