【问题标题】:Interval Tree implementation taking a lot of filespace space after serialization序列化后间隔树实现占用大量文件空间
【发布时间】:2017-08-16 22:26:20
【问题描述】:

我有一个文本文件,其中包含 IPv6 范围以及该范围属于哪个 ISP(范围不重叠)。一些示例(假)行如下:

2010:258:0:0:0:0:0:0;2010:258:ffff:ffff:ffff:ffff:ffff:ffff;ISP_1;
2010:260:0:0:0:0:0:0;2010:260:ffff:ffff:ffff:ffff:ffff:ffff;ISP_2;
2010:268:0:0:0:0:0:0;2010:268:ffff:ffff:ffff:ffff:ffff:ffff;ISP_3;

我已经获取了这个文本文件并从中创建了一个Interval Tree,以便我可以快速查找特定 IP 属于哪个 ISP。 Interval 树中的每个节点都具有以下结构:

public class Node implements Serializable {
    Range nodeRange;

    IntervalTreeNode left;
    IntervalTreeNode right;

    UnsignedLong128 centerValue;

}

这里是Range

public abstract class Range implements Comparable<Range>, Serializable {

    UnsignedLong128 start;
    UnsignedLong128 end;
    boolean sortAccordingToStart;
}

UnsignedLong128 是我编写的自定义 Long 类,长度为 128 位:

public class UnsignedLong128 implements Comparable<UnsignedLong128>, Serializable {

    Long major;
    Long minor;
}

问题是,如果我将树序列化并写入文件,该文件的大小比原始文本文件大很多。这是一个示例:我有一个包含 19860 行范围的文本文件,该文本文件的大小为 1.7 MB。当我基于它创建间隔树并将该树写入文件(通过 Java 的序列化)时,生成的文件的大小为 15.7 MB,即使它存储了相同的信息。是的,树的节点数量是文本文件中行数的两倍(我生成的树是平衡的),这仍然不能证明文件大小增加这么多是合理的。

那么是什么导致这个文件变大了,我该如何减少它呢?

【问题讨论】:

  • 如果你不需要坚持序列化,你也可以创建一个readFile和一个toFile方法来存储树。

标签: java algorithm optimization serialization tree


【解决方案1】:

Java 序列化会有很多开销,如果你用文本编辑器查看文件,你可能会看到。

由于范围不重叠,您可以将数据保持在排序顺序(比较两个范围,比较它们的起点或终点)并使用二分搜索来查找匹配项。然后你只需要序列化一个结构数组。您可能会发现 Java 序列化的开销更少,其中您有一个大数组或三个大数组,保存起点、终点和 ISP id,或者您可以自己读写数据。

您还可以研究 readResolve() 和 writeReplace()

【讨论】:

    【解决方案2】:

    您可以实现Externalizable,它允许您在保持Serializable 框架的同时自定义序列化。这很简单,您需要每个字段和每个方向一条线。 Serializable 有一些开销,因为每个字段都可能包含 null 或其类型的子类的实例,但您通常知道它不会发生。

    我不确定,但我猜Serializable 默认使用 UTF-16,这既快速又简单,因为这与 Java 内部所做的(或所做的,因为 Java 9 可以做得更好)有关,但它浪费了纯 ASCII 的两倍(使用 UTF-8 很好)。看起来你用数字替换了字符串,所以它可能没有帮助。

    您的UnsignedLong128 在内存中也很浪费。将Long 替换为long。不知道,它对序列化数据大小有多大帮助,但您可以节省大量 RAM(并获得一些速度)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2019-03-28
      相关资源
      最近更新 更多