0

メモリに入れるには大きすぎる Integer[] のファイルがあります。x の最後のメンバーを持つすべての配列を検索し、それらを他のコードで使用したいと思います。これを行うために Guava のマルチマップを使用する方法はありますか? x はキーでメモリに格納され、Integer[] は値でディスクに格納されますか このシナリオでは、キーは一意ではありませんが、キーと値のペアは一意です。この multimap の読み取り (可能な場合) は並行して行われます。また、これにアプローチする他の方法の提案も受け付けています。
ありがとう

4

1 に答える 1

3

(配列のファイル内のインデックスに基づいて)ディスク上の配列を表すクラスを作成し、それを呼び出して、そのインスタンスを:FileBackedIntArrayの値として配置することができます。HashMultimap<Integer, FileBackedIntArray>

public class FileBackedIntArray {
    // Index of the array in the file of arrays
    private final int index;
    private final int lastElement;

    public FileBackedIntArray(int index, int lastElement) {
        this.index = index;
        this.lastElement = lastElement;
    }

    public int getIndex() {
        return index;
    }

    public int[] readArray() {
        // Read the file and deserialize the array at the associated index
        return smth;
    }

    public int getLastElement() {
        return lastElement;
    }

    @Override
    public int hashCode() {
        return index;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        } else if (o == null || o.getClass() != getClass()) {
            return false;
        }

        return index == ((FileBackedIntArray) o).index;
    }
}

ちなみに、実際には、ではInteger[]なく、が必要ですかint[](つまり、null値を持つことができます)?コメントで述べたように、実際には、は必要ありません。Integer[]したがって、どこでもsを使用intsすると、ボックス化/ボックス化解除が回避され、多くのスペースがあるように見えるため、多くのスペースを節約できます。うまくいけば、最後の要素(x)に可能な値が大量にないことを願っています。

次に、配列ごとにインスタンスを作成し、最後の要素を読み取ってMultimap、配列を保持せずに配置します。ポピュレーションはMultimapシーケンシャルであるか、同時の場合はロックで保護する必要がありますが、読み取りは保護なしで同時にすることができます。ImmutableMultimapが設定されたら、HashMultimap変更を防ぐために、並行環境での安全な方法を作成することもできます。

于 2012-10-01T07:59:14.003 に答える