Я сталкиваюсь со следующим исключением при использовании пакета FlatFileItemWriter
в Spring для записи данных из Map
(т.е. в кеш) в файл:
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
at java.lang.StringCoding.encode(StringCoding.java:344)
at java.lang.String.getBytes(String.java:918)
at org.springframework.batch.support.transaction.TransactionAwareBufferedWriter.getBufferSize(TransactionAwareBufferedWriter.java:163)
at org.springframework.batch.item.file.FlatFileItemWriter$OutputState.position(FlatFileItemWriter.java:442)
at org.springframework.batch.item.file.FlatFileItemWriter.update(FlatFileItemWriter.java:366)
Я посмотрел накод, присутствующий в строке 163 в классе TransactionAwareBufferedWriter
Spring Batch, который выглядит следующим образом:
public long getBufferSize() {
if (!transactionActive()) {
return 0L;
}
try {
//Exception is at the following line - Line number 163
return getCurrentBuffer().toString().getBytes(encoding).length;
} catch (UnsupportedEncodingException e) {
throw new WriteFailedException("Could not determine buffer size because of unsupported encoding: " + encoding, e);
}
}
Чтобы получить больше фона, файл, в который я пишу, имеет около 129 столбцов для записи.Я понимаю, что это большое число, но сокращение количества столбцов не вариант.Кроме того, перед тем, как возникнет это исключение, в файл будет записано большое количество записей (в миллионах).
Если посмотреть на исключение и строку кода, вызывающую его, похоже, что проблема возникает, когда числоколичество байтов в буфере превышает разрешенное виртуальной машиной (размер массива).
Я прочитал вопросы / ответы на этом сайте, но большинство из них рассказывают об использовании лучшей структуры данных.Поскольку этот код не находится под моим контролем, я не смогу применить это решение.
Любые указания о том, как мне поступить для устранения этой ошибки, были бы полезны