Byte [] и java.lang.OutOfMemoryError читают файл по битам - PullRequest
4 голосов
/ 29 февраля 2012

Я пытаюсь написать ридер, который читает файлы по битам, но у меня проблема с большими файлами. Я попытался прочитать файл на 100 МБ, и это заняло более 3 минут, но это сработало.

Однако тогда я попробовал файл с 500 мб, но он даже не запустился. Из-за этой строки:

byte[] fileBits = new byte[len];

Сейчас я ищу решения и не могу их найти. Может быть, кто-то решил это и может поделиться кодом, советами или идеей.

if (file.length() > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("File is too large: " + file.length());
}

int len = (int) file.length();
FileInputStream inputStream = new FileInputStream(file);

try {
    byte[] fileBits = new byte[len];
    for (int pos = 0; pos < len;) {
        int n = inputStream.read(fileBits, pos, len - pos);
        if (n < 0) {
            throw new EOFException();
        }
        pos += n;
    }

inputStream.read(fileBits, 0, inputStream.available());
inputStream.close();

Ответы [ 4 ]

6 голосов
/ 29 февраля 2012

Я предлагаю вам попробовать отображение памяти.

FileChannel fc = new FileInputStream(file).getChannel();
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, (int) fc.size());

Это сделает весь файл доступным почти сразу (около 10 мс) и использует его почти без кучи. КСТАТИ Файл должен быть менее 2 ГБ.

2 голосов
/ 29 февраля 2012

Если вам действительно нужно сразу загрузить весь файл в память, я могу только предложить увеличить объем памяти, доступной для Java. Попробуйте вызвать вашу программу, используя аргументы Xmx (максимальный размер кучи) или Xms (начальный размер кучи) (используйте последний, если вы заранее знаете, сколько памяти вам понадобится, в противном случае первый может быть лучшим).

java -Xms512m -Xmx1g BigApp

В качестве альтернативы вы можете использовать NIO Файлы с отображением в памяти .

1 голос
/ 29 февраля 2012

Я предлагаю вам использовать RandomAccessFile.

1 голос
/ 29 февраля 2012

Вы не должны открывать весь файл в память.Вам нужно создать буфер байтового массива с фиксированным размером, затем вы откроете свой файл из кусков определенного вами размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...