1

我得到一个大的 ScheduledFuture 数据作为 Future.get() 的返回。我相信 ScheduledFuture 只能在 get() 完成时检索返回。所以它总是会在我的机器上生成“java.util.concurrent.executionexception java.lang.outofmemoryerror java heap space”错误。

当我使用 scheduleExecutorService 时,是否有任何替代解决方案可以将我的退货分成几部分?谢谢。

4

1 回答 1

1

让您的任务将结果保存到磁盘,并让get()方法返回File结果写入的位置。

请注意,序列化不会帮助您避免内存问题,因为您首先要避免在内存中创建整个结果(将其传回不会使用更多内存)。

您将需要使用“流式传输”方法,其中一小部分数据在创建后立即写入磁盘。

同样,结果的用户应该将数据流式传输,在内存中处理小部分,然后丢弃部分(取消引用它),然后再读入更多内容。

为方便起见,您还可以考虑使用临时文件:

File file = File.createTempFile("foo", "dat");
file.deleteOnExit(); // optional, but safer
于 2014-07-31T23:16:16.787 回答