0

私の状況を紹介させてください。

サーバー上のファイルに保存されているバイト単位のデータがたくさんあります。JDK7 で導入される AIO を使用して、このファイルを読み書きしています。したがって、読み取りおよび書き込み操作に ByteBuffer(s) を使用しています。

問題は、AsynchronousFileChannel で読み取りを実行したら、読み取り操作で使用された ByteByffer の内容をクライアントに転送したいということです。したがって、実際にバイトを送信したいと思います。

ここからどうするのが最善の方法でしょう。再利用するプールがあるため、ByteBuffer を送信したくありません。したがって、これはオプションではありません。いくつかの読み取りを組み合わせて、一度に組み合わせた複数の ByteBuffer(s) のコンテンツを送信することもできるようにしたいと考えています。

さて、何を送ろう。ただのバイト[]配列?それともストリームが必要ですか?ここでのパフォーマンスに関する最善の解決策は何ですか。

通信には RMI を使用しています。

事前にサンクス。

4

3 に答える 3

1

RMIIOライブラリを使用して rmi 経由のストリームをシミュレートできます。これにより、どちらの側でもメモリの問題を引き起こすことなく、RMI を介して任意の量のバイトをストリーミングできます。

(免責事項、私はライブラリを書きました)

于 2011-04-19T17:12:00.953 に答える
0

RMIを使用するには、バッファの内容をとして取得してからbyte[]、に書き込む必要がありますObjectOutputStream(書き込みは内部で行われます)。現在直接バッファを使用していると仮定すると、これは、Javaヒープに配列を作成するためのCPU時間、および書き込まれた配列をガベージコレクションするためのCPU時間、およびストリームが参照を保持しすぎる可能性を意味します。 、メモリ不足エラーが発生します。

私の意見では、より良いアプローチは、宛先に対してaを開き、SocketChannelそれを使用してバッファーの内容を書き込むことです。もちろん、これを機能させるには、バッファのサイズを説明する追加のデータを書き込む必要があります。これはおそらく通信プロトコルに進化します。

于 2011-04-19T16:11:22.977 に答える
0

送信しない十分な理由がない限り、信頼できるサービスを提供できる十分なメタデータとともにバイト配列を送信してください。

RMI を介してやり取りする必要がある基礎となる実装が少ないほど、優れています。特に、まだ一般公開されていない Java 7 を使用している場合。

于 2011-04-19T15:48:52.623 に答える