Есть ли альтернативное решение, когда возвращаемое значение Future.get() слишком велико?
Я получаю большие данные ScheduledFuture как возвращение Future.get(). Я считаю, что ScheduledFuture может получить возврат только тогда, когда get () будет сделано. Поэтому на моем компьютере всегда будет выдаваться ошибка "java.util.concurrent.executionexception java.lang.outofmemoryerror" пространство кучи Java ".
Есть ли альтернативное решение, которое я мог бы разделить мой возврат на части, когда я использую scheduleExecutorService? Благодарю.
1 ответ
Ваша задача сохранить результат на диск, и иметь get()
метод вернуть File
на что был написан результат.
Обратите внимание, что сериализация не поможет вам избежать проблем с памятью, потому что вы хотите избежать создания всего результата в памяти, во-первых (передача его назад не использует больше памяти).
Вы захотите использовать потоковый подход, при котором небольшие части данных записываются на диск сразу после их создания.
Точно так же пользователь результата должен передать данные в, обработать небольшие части в памяти, затем отбросить часть (разыменовать ее), прежде чем читать дальше.
Вы также можете рассмотреть возможность использования временного файла для удобства:
File file = File.createTempFile("foo", "dat");
file.deleteOnExit(); // optional, but safer