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