我的JSON文件太大而无法放入内存,我该怎么办?

时间:2012-07-10 21:41:05

标签: java json jackson

在我的程序中,我正在从磁盘中读取一系列文本文件。对于每个文本文件,我处理一些数据并将结果作为JSON存储在磁盘上。在此设计中,每个文件都有自己的JSON文件。除此之外,我还将一些数据存储在单独的JSON文件中,该文件存储来自多个文件的相关数据。我的问题是,每个解析的文件共享JSON越来越大,最终会占用太多内存。我在32位机器上,有4 GB的RAM,不能再增加Java VM的内存大小。

要考虑的另一个限制是我经常回顾旧的JSON。例如,假设我从FileY中提取出ObjX。在伪代码中,发生以下情况(使用Jackson进行JSON序列化/反序列化):

// In the main method.
FileYJSON = parse(FileY);
ObjX = FileYJSON.get(some_key);
sharedJSON.add(ObjX);

// In sharedJSON object
List objList;

function add(obj)
    if (!objList.contains(obj))
        objList.add(obj);

我唯一能想到的就是使用流式JSON,但问题是我经常需要访问之前的JSON,所以我不知道该流是否可行。我的数据类型不仅仅是字符串,这使我无法使用Jackson的流媒体功能(我相信)。有谁知道一个好的解决方案?

2 个答案:

答案 0 :(得分:2)

如果您的数据结构太大而内存不足,则必须开始使用其他内容。我建议您使用数据库,这将显着加快数据检索和存储速度。它还会使您的数据结构限制为硬盘驱动器的大小,而不是RAM的大小。

尝试使用this page来介绍Java和数据库。

答案 1 :(得分:1)

我无法相信你真的只需要4GB RAM用于文本文件和JSON。

我看到了三种可能的解决方案。

  1. 如果可能,请切换到纯文本。那不是记忆中的饥渴。
  2. 只需根据需要打开和关闭文件即可。您可以将文件命名为特定的命名约定,例如哈希值的前两个/三个......数字,然后根据需要打开它们。
  3. 如果您有这么多数据,您可以切换到数据库。这样可以节省大量资源。
  4. 如果你有可能,我更愿意选择3。