【发布时间】: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