1

IOException: Map Failed大きなバイト配列を書き込もうとすると、取得します。以下の方法を使用して、バイト配列をファイルに書き込みます

private static void write(byte[] data) throws Exception {
        File file = new File("C:/temp/file.json");
        int length = data.length;
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        FileChannel fc = raf.getChannel();
        MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, length);
        for (int i = 0; i < length; i++) {
            buffer.put(data[i]);
        }
}

バイト配列は約270mbです。誰かが私が間違っていることを説明できますか?ありがとう。

4

3 に答える 3

4

マップが失敗した理由はわかりませんが、あなたが行ったようにはしません。

FileOutputStream out = new FileOutputStream(filename);
out.write(data);
out.close();

徐々にそれを行うには、あなたが使用することができます

FileOutputStream out = new FileOutputStream(filename);
for(int i = 0; i < data.length; i += 8192)
    out.write(data, i, Math.min(data.length-i, 8192));
out.close();

32ビットのJVMがあり、このメソッドを繰り返し呼び出すと、マップが失敗する可能性があります。たとえば、仮想メモリが不足しています。

于 2012-08-30T11:07:52.967 に答える
1

mmap()解はCの関数と同じだと思います。ファイルを作成したばかりの場合は、data.length-1マッピングする前にそのサイズのファイルを作成するために、この位置にバイトをオフセットして書き込むようにファイルを探す必要があります。Cで実行しないと、マップされたメモリにアクセスしているときにメモリが破損します。

そのようなものが機能するはずです:

private static void write(byte[] data) throws Exception {
        File file = new File("C:/temp/file.json");
        int length = data.length;
        RandomAccessFile raf = new RandomAccessFile(file, "rw");

        FileChannel fc = raf.getChannel();
        fc.position(size-1);
        ByteBuffer bf = ByteBuffer.wrap(new byte[]{0x00});

        bf.flip();  // Not sure if flip is needed !!!!!!!

        fc.write(bf);

        MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, length);
        for (int i = 0; i < length; i++) {
            buffer.put(data[i]);
        }
}

簡単にするために:ファイルサイズを超えてマップすることはできません。そのため、マップする前にファイルサイズを増やす必要があります。

FileOutputStreamこれで問題を説明できますが、を開いてデータを直接書き込む方が適切だと思います。必要に応じて、後でマップすることもできます。

于 2012-08-30T11:10:19.570 に答える
0

JVMの最大ヒープサイズは少なくとも270*2 MBですか?これは、Javaの起動に使用するコマンドラインで設定します。

java ... -Xmx1024m..。

于 2012-08-30T11:09:32.410 に答える