1

大きなファイル(ファイルサイズ>ヒープ/ RAMサイズ)をネットワーク経由で転送するにはどうすればよいですか?

ファイル(サイズ10GB)があり、それをマシンa(RAM 512mb)からマシンb(RAM 512mb)に転送したいとします。

Javaコードを使用してこれを達成したい。

まず、それは可能ですか?フレームワークに関する推奨事項。可能であれば、スレッドを使用してこれを高速化できますか?重要な基準:ファイルのデータシーケンスは、転送中に維持する必要があります。どんな例でも大いに役立ちます。

4

4 に答える 4

3

確かにそれは可能です。ストリームを使用する必要があります。スレッド化によって転送速度が向上する場合は、ネットワークによって異なりますが、送信側と受信側を実装しているため(帯域幅を制限しないため)、向上させることはできません。したがって、制限要因は、拡張できないネットワーク帯域幅になります。ただし、ストリームの圧縮を検討することはできます。

要件を知らずに例を示すのは難しいです。たとえば、 RMIIOを使用してRMIでファイルを転送しています。ただし、RMIの使用を強制されていない場合は、これを行うことはお勧めしません。

于 2012-04-16T11:04:18.577 に答える
1

まず、それは可能ですか?

もちろん。

フレームワークに関する推奨事項。

フレームワークはありません。すべてが完了するまで、バッファを読み取る/バッファを書き込むだけです。

可能であれば、スレッドを使用してこれを高速化できますか?

1つのスレッドを使用してローカルから読み取り、別のスレッドを使用してネットワークソケットに書き込むことは、役に立たない可能性があります。ほとんどの場合、ファイルはネットワークに書き込むよりも数十倍または数百倍速く読み取ることができるため、ダブルバッファリングによる高速化の余地はほとんどありません。

状況によっては、複数の並列ストリームを使用して転送を実行することで、スループットを向上させることができます。ただし、これはネットワークの輻輳も引き起こす可能性があり、スループットの低下につながる可能性があります。そしてもちろん、他のユーザーのネットワークパフォーマンスを損なうリスクがあります。

したがって、重大な問題であり、問​​題に多くの時間を費やす余裕がない限り、マルチスレッドによる転送の高速化をわざわざ試みないようにすることをお勧めします。

于 2012-04-16T11:25:42.767 に答える
1

ストリーミング転送を使用します。これは、固定サイズ、たとえば64 kBのバッファーにデータを読み取り、そのバッファーでデータを送信してから、データでいっぱいの別のバッファーを読み取ることを意味します。このように、ファイルのサイズに関係なく一定量のメモリが必要です(無限である可能性もあり、メモリを使いすぎずに転送を続けることができます)。InputStreamバイトを配列に読み込む、またはSocketChannelからnioを使用するのメソッドを確認してくださいByteBuffers

于 2012-04-16T11:11:57.723 に答える
1

まず、それは可能ですか?

一度に1つのブロックを読み書きします(例:byte[]8 KB)。

フレームワークに関する推奨事項。可能であれば、スレッドを使用してこれを高速化できますか?

使用している帯域幅の量を増やすことで、これを高速化できます。CPUがボトルネックになる可能性は非常に低いため、スレッド化の可能性は低くなります(ただし、コードはより複雑になります)

どんな例でも大いに役立ちます。

ウェブ上にはすでに何百万もあります。;)

于 2012-04-16T11:07:59.507 に答える