3

この質問は serverfault と stackoverflow の両方にまたがるので、私はこれを選びました。

いくつかの単純なファイル コピー コードで次の例外が発生します。Windows Server 2003 x64 で実行されています

Caused by: java.io.IOException: Insufficient system resources exist to complete the requested service
at sun.nio.ch.FileDispatcher.pwrite0(Native Method)
at sun.nio.ch.FileDispatcher.pwrite(Unknown Source)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source)
at sun.nio.ch.IOUtil.write(Unknown Source)
at sun.nio.ch.FileChannelImpl.write(Unknown Source)
at sun.nio.ch.FileChannelImpl.transferFromFileChannel(Unknown Source)
at sun.nio.ch.FileChannelImpl.transferFrom(Unknown Source)
at Tools.copy(Tools.java:473)

public static void copy(FileChannel input, FileChannel output) throws IOException {
    final long size = input.size();
    long pos = 0;
    while (pos < size) {
        final long count = (size - pos) > FIFTY_MB ? FIFTY_MB : (size - pos);
        pos += output.transferFrom(input, pos, count);
    }
}

問題は、このコードを実行しているサーバーが真新しく非常に強力であるため、どのシステム リソースが不足している可能性があるのか​​ わかりません。

これは、ここで説明されているエラーのようです: http://support.microsoft.com/kb/304101

しかし、レジストリの編集を追加してカーネル メモリのページ サイズを増やしてみましたが、役に立ちませんでした。

私が実際に得られないのはFileChannel transferFrom、50 MB のはるかに大きなチャンクを使用するコードを見たことがあります。私は、コードが 1 つのチャンクで 1 GB をはるかに超えるファイルに対して機能することを見てきました。しかし、サーバーがスタックしているファイルはわずか 32 MB です。

ここで何が起こっているのですか?FileChannelこれはWindowsの問題ですか?

4

1 に答える 1

4

これは、「バグ」ID 4938442:NIOFileChannelsを使用して大きなファイルをコピーする場合のシステムリソースが不十分であることに関連している可能性があります。

評価:バグではありません。これは、ファイルサーバー(またはクライアント)の構成の問題である可能性があります。

顧客が提出した回避策:

  • NIOは使用しないでください。NIOは大きなファイルのパフォーマンスを大幅に向上させるため(少なくともローカルディスクからローカルディスクへのコピーを実行する場合)、この回避策を回避することをお勧めします。

  • より少ないバイト数で転送できます。このエラーが発生せずにコピーできる実際のバイト数は、WindowsXPとWindows2000サーバーでは異なるようです。確かに、32Mbの値は機能しているように見えます。

于 2010-05-18T17:31:36.667 に答える