【问题标题】:adding Elements to Serialized ArrayList without loading ArrayList into RAM in JAVA将元素添加到序列化的 ArrayList 而不将 ArrayList 加载到 JAVA 中的 RAM
【发布时间】:2017-06-23 02:35:10
【问题描述】:

是否可以将元素添加到已经序列化到磁盘的 java 中的数组列表中,而无需将其重新加载到 RAM 中。我需要这个来保存 XML 文件中的结构化数据以将数据加载到 mysql 数据库中。 XML 文件有几 GB 的数据,问题是我必须存储 XML 文件中的所有数据才能处理数据?

【问题讨论】:

  • ArrayList 是否使用标准 Java 序列化进行序列化?替代序列化?你自己的序列化?您是否必须将 XML 文件作为原始 Java 对象加载,还是可以使用标准 XML 工具对其进行处理?
  • 我想用标准 Java 序列化对其进行序列化。我正在逐行处理 XML 文件,因为将其加载到 ram 中太大了。我分析每个标签并将其存储在数组中,如果内存中的大小超过某个值,我想将这些数组序列化为磁盘上的对象

标签: java serializable


【解决方案1】:

ArrayList 或任何其他数据结构都是内存数据结构。所以,无论你想在这个数据结构中放入什么,都必须加载到内存(RAM)中。

如果您想知道如何加载超过内存大小本身的数据,请考虑分批加载。例如加载第一个符合内存约束的n 条目,然后处理它们。完成后,丢弃这些并加载下一批,依此类推。

【讨论】:

  • 好吧,我认为我必须走这条路,但我希望有人知道以不同的方式这样做的可能性
【解决方案2】:

我认为由于您的 XML 文件已经以 GB 为单位,那么更好的方法是读取块中的 XML 文件并将记录块保存到数据库。继续这样做,直到到达 EOF。

String encoding = "UTF-8";
int maxlines = 100;
BufferedReader reader = null;
BufferedWriter writer = null;

try {
    reader = new BufferedReader(new InputStreamReader(new FileInputStream("/bigfile.txt"), encoding));
    int count = 0;
    for (String line; (line = reader.readLine()) != null;) {
        if (count++ % maxlines == 0) {
            close(writer);
            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/smallfile" + (count / maxlines) + ".txt"), encoding));
        }
        writer.write(line);
        writer.newLine();
    }
} finally {
    close(writer);
    close(reader);
}

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多