即使在程序存在之后也存储临时数据

时间:2014-08-19 20:16:12

标签: java

我有一个程序可以解析数十万个文件,存储每个文件的数据,最后将一些数据打印到excel文档中。

这些是我在内存方面遇到和处理的一些错误:

  1. java.lang.OutOfMemoryError:Java堆空间 内存增加到2GB

  2. VM初始化期间发生错误。无法为2097152KB对象堆保留足够的空间 下载了64位机器的jre8。将-d64设置为默认的vm参数之一

  3. java.lang.OurOfMemoryError:超出了GC开销限制 将Java堆内存从2gb增加到3g并包含此参数-XX:-UseGCOverheadLimit

  4. 所以现在我的默认VM参数是:-d64 -Xmx3g -XX:-UseGCOverheadLimit

    问题是我的程序运行了几个小时,从所有这些文件读入并存储了我需要的所有信息,然后在发生内存错误时尝试打印所有内容时最后抛出错误。 / p>

    我想知道的是,如果有一种方法来存储提取的数据,然后再次访问它,即使程序由于错误而退出。我想存储数据的方式与我在程序中使用的格式相同。例如,假设我有几十万个用户记录文件,我遍历了所有这些文件,存储了我在用户对象中提取的数据,并且我将这些用户和其他个人定义的对象存储在HashMaps和LinkedLists中。有没有办法存储这些用户对象和HashMaps和LinkedLists的方式即使程序由于错误退出我可以编写另一个程序,将通过目前存储的对象并打印出我想要的信息而不用经历读入,提取和存储信息的过程?

2 个答案:

答案 0 :(得分:0)

这样做的一种方法称为序列化。 (What is object serialization?)。

但是,根据您的数据,您可以将信息写入一个方便的XML文件中,在提取所有数据后,只需加载XML并继续操作。

希望有所帮助。

答案 1 :(得分:0)

首先,你很少需要同时在内存中使用这么多的文本数据,并且不能迭代地使用和丢弃它。

如果您真的需要对这么多数据进行操作,请考虑使用map-reduce框架(例如Google提供的框架)。它将解决速度和内存问题。

最后,如果您确定无法通过其他两种方式解决问题,或者如果map-reduce设置不值得,那么您唯一的选择就是将数据写入文件(某处)。序列化数据的好方法是使用Json。谷歌的gsonJackson 2是受欢迎的图书馆。