我得到一个大的 ScheduledFuture 数据作为 Future.get() 的返回。我相信 ScheduledFuture 只能在 get() 完成时检索返回。所以它总是会在我的机器上生成“java.util.concurrent.executionexception java.lang.outofmemoryerror java heap space”错误。
当我使用 scheduleExecutorService 时,是否有任何替代解决方案可以将我的退货分成几部分?谢谢。
我得到一个大的 ScheduledFuture 数据作为 Future.get() 的返回。我相信 ScheduledFuture 只能在 get() 完成时检索返回。所以它总是会在我的机器上生成“java.util.concurrent.executionexception java.lang.outofmemoryerror java heap space”错误。
当我使用 scheduleExecutorService 时,是否有任何替代解决方案可以将我的退货分成几部分?谢谢。
让您的任务将结果保存到磁盘,并让get()
方法返回File
结果写入的位置。
请注意,序列化不会帮助您避免内存问题,因为您首先要避免在内存中创建整个结果(将其传回不会使用更多内存)。
您将需要使用“流式传输”方法,其中一小部分数据在创建后立即写入磁盘。
同样,结果的用户应该将数据流式传输,在内存中处理小部分,然后丢弃部分(取消引用它),然后再读入更多内容。
为方便起见,您还可以考虑使用临时文件:
File file = File.createTempFile("foo", "dat");
file.deleteOnExit(); // optional, but safer