Запрашиваемый размер массива превышает ограничение виртуальной машины при чтении последовательности файлов - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь прочитать байты из файла последовательности с определенным ключом в списке.Когда я вызываю метод getCurrentValue, я получаю OutOfMemoryError: размер запрашиваемого массива превышает ограничение виртуальной машины.Что мне нужно, чтобы прочитать все байты этого ключа.

Я пытался изменить емкость BytesWritable buf до 1 ГБ, но это не помогло.

public List<byte[]> read(String path, String key) {
        Path hdfsPath = new Path(path);
        List<byte[]> fileBytes = new ArrayList<>(1);

        Text keyBuf = new Text();

        try (SequenceFile.Reader in = new SequenceFile.Reader(connectionConfig, SequenceFile.Reader.file(hdfsPath))) {
            while (in.next(keyBuf)) {
                if (keyBuf.toString().equals(key)) {
                    BytesWritable buf = new BytesWritable();
                    in.getCurrentValue(buf); //here throw exception
                    fileBytes.add(buf.getBytes());
                }
            }
        } catch (IOException e) {
            throw new HdfsException("When read file, path=" + path + " key=" + keyBuf, e);
        }

        return fileBytes;
    }

Исключение:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at org.apache.hadoop.io.BytesWritable.setCapacity(BytesWritable.java:146)
at org.apache.hadoop.io.BytesWritable.setSize(BytesWritable.java:125)
at org.apache.hadoop.io.BytesWritable.readFields(BytesWritable.java:181)
at org.apache.hadoop.io.SequenceFile$Reader.getCurrentValue(SequenceFile.java:2308)
at ...
...