【问题标题】:Partial deserialization of a huge binary file - Java大型二进制文件的部分反序列化 - Java
【发布时间】:2015-06-19 14:29:31
【问题描述】:

这是我对 StackOverflow 的第一个问题。如果问题不清楚并需要更多详细信息,请告诉我。

我有一个类,它具有如下三个属性:

 class SampleClass {
long [] field1;
float[] field2;
float[] field3;
}

构建了一个巨大的 SampleClass 对象(每个数组大约有十亿个条目)。这个对象在一台主机上被序列化,序列化后的文件被上传到另一台机器上。现在我只想反序列化文件的一部分,以便获得一个较小的 SampleClass 对象,每个字段填充大约 10 个索引,而不是完整的对象。因为这台机器没有足够的容量在内存中加载这么大的对象。这可能吗?

对象是使用 JAVA 的 writeObject 方法序列化的,它是由不同的实用程序完成的,所以我无法控制它。提前致谢。

【问题讨论】:

  • 该对象不应该存储在数据库中而不是二进制文件中吗?

标签: java serialization


【解决方案1】:

忘记使用 Java 序列化 API - 它只是设计用于反序列化所有内容。如果您无法控制序列化文件的生成方式,那么您应该考虑自己解析序列化文件并提取必要的部分——这并不难。

Java 序列化格式有据可查(参见例如 official docsinformative article),并且存在解析格式的工具(例如 Serialysisjdeserialize),尽管编写您的基于格式规范的自己的工具。

一旦你可以解析序列化的数据,你就可以简单地提取你需要的并跳过你不需要的。

【讨论】:

    【解决方案2】:

    鉴于您无法控制/覆盖序列化本身,您最好的选择是实际仅序列化您需要的部分。在序列化整个文件并能够反序列化它的机器上:

    1) 将整个文件加载到对象中

    2) 创建 SampleClass 的新对象

    3) 将每个数组中所需区域的元素复制到空白 SampleClass 对象

    4) 序列化这个较小的版本

    如果有帮助,可以将字段设置为瞬态,这样它们就不会被序列化。

    不过,在我看来,这个对象应该在数据库中:

    • 它不适合虚拟内存
    • 在给定时间只需要其中的一部分。

    因此您可以使用硬盘来存储它并查询以获取所需的部分。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2014-01-04
      • 2014-10-16
      • 2013-12-06
      • 2014-12-19
      • 2020-03-07
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多