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