いくつかの異なるマシンで使用したいクワッドツリー*があります。コンストラクターの呼び出し(つまり、ツリーの構築)には長い時間がかかります。使用するたびにツリーを構築したくありません。
ツリーをハードディスクに永続化し、それを各ノードに送信してから、ルックアップを実行できるようにメモリにすばやくロードする方法を探しています。
シリアル化はこれに役立ちますか?ツリーをシリアル化し、ディスクに保存してから逆シリアル化できることを知っています(シリアル化について知っていることはこれだけです)。私の知る限り、脱セリル化ステップには、ツリーを構築するためのデフォルトのコンストラクターが必要です。ツリーの構築には計算コストがかかるため、これは私には役に立ちません。
永続化されたツリーを毎回再構築せずにインポートできる方法はありますか?
*使用したクワッドツリーのベースコード:https ://bitbucket.org/utcompling/textgrounder/src/f38150c7f33a/src/main/java/ags/utils/KdTree.java
これが基本的すぎる場合は、お詫びします:https ://stackoverflow.com/questions/14701245/how-do-i-perform-kd-tree-lookups-in-hadoop
編集:つまり、最も継承されていないクラスの引数なしのコンストラクターが呼び出されるように見えます。これが私の雇用です:
抽象KDTree
QuadTreeはKdTreeを拡張します
SpecialQuadTree(QuadTreeのインスタンスがあります)
現在、SpecialQuadTreeをシリアル化できるのは、すべてをシリアル化可能にした場合のみです(そうでない場合、NotSerizableまたはInvalidClassExceptionに有効なコンストラクターがありません)。
抽象KDTreeはSerializableを実装します
QuadTreeはKdTreeを拡張してSerializableを実装します
SpecialQuadTreeはSerializableを実装します(QuadTreeのインスタンスがあります)
したがって、SerializableをKdTreeから削除して、何もしない引数なしのコンストラクターを指定できると思いますか?それは簡単ではありません。私はKdTreeクラスを記述せず、理解していませんでした。私はそれをサブクラス化し、サブクラスに何もしない引数のないコンストラクターを与え、そこからQuadTreeを継承できると思います...
編集:わかりました、私は抽象クラスを持っています抽象KDTreeはSerializableを実装しています
そしてそれから私は拡張します:QuadTreeはKdTreeを拡張し、Serializableを実装します
私のすべての実験から、両方にSerializableを実装する必要があります。今、
public QuadTree() {
super(2, 1000000);
System.out.println("QuadTree no-args!");
}
と
protected KdTree(int dimensions, Integer sizeLimit) {
System.out.println("KdTree, constructor!");
私はそれが印刷されるのを見たことがないので(最初の構造を除いて...)、それはすべて良いと思います。