Java 使用随机访问文件的Guava多重映射?
我有一个整数[]s的文件太大,无法放入内存。我想搜索最后一个成员为x的所有数组,并在其他代码中使用它们。有没有一种方法可以使用Guava的multimap实现这一点,其中x是键并存储在内存中,整数[]是值并存储在磁盘上?在这种情况下,键不是唯一的,但键值对是唯一的。同时读取此多重映射(假设可能)。我也愿意接受其他方法的建议。Java 使用随机访问文件的Guava多重映射?,java,io,guava,bigdata,Java,Io,Guava,Bigdata,我有一个整数[]s的文件太大,无法放入内存。我想搜索最后一个成员为x的所有数组,并在其他代码中使用它们。有没有一种方法可以使用Guava的multimap实现这一点,其中x是键并存储在内存中,整数[]是值并存储在磁盘上?在这种情况下,键不是唯一的,但键值对是唯一的。同时读取此多重映射(假设可能)。我也愿意接受其他方法的建议。 感谢您可以创建一个表示磁盘上数组的类(基于其在数组文件中的索引),我们将其称为FileBackedIntArray,并将其实例作为HashMultimap的值: 顺便问一下
感谢您可以创建一个表示磁盘上数组的类(基于其在数组文件中的索引),我们将其称为
FileBackedIntArray
,并将其实例作为HashMultimap
的值:
顺便问一下,您是否确实需要一个整数[]
而不是int[]
(即您可以有null
值)?正如您在评论中所说,您实际上并不需要一个整数[]
,因此在任何地方使用ints
s都可以避免装箱/拆箱,并且可以节省大量空间,因为您似乎有很多这样的整数。希望最后一个元素(x)没有太多可能的值
然后为每个数组创建一个实例,并读取最后一个元素,将其放入
Multimap
,而不保留数组。填充Multimap
需要按顺序进行,如果是并发的,则需要使用锁进行保护,但是读取可以是并发的,而不需要任何保护。您甚至可以在填充了HashMultimap
之后创建一个ImmutableMultimap
,以防止任何修改,这是并发环境中的一种安全做法。您可以创建一个表示磁盘上数组的类(基于其在数组文件中的索引),我们称之为FileBackedIntArray
,并将其实例作为HashMultimap
的值:
顺便问一下,您是否确实需要一个整数[]
而不是int[]
(即您可以有null
值)?正如您在评论中所说,您实际上并不需要一个整数[]
,因此在任何地方使用ints
s都可以避免装箱/拆箱,并且可以节省大量空间,因为您似乎有很多这样的整数。希望最后一个元素(x)没有太多可能的值
然后为每个数组创建一个实例,并读取最后一个元素,将其放入
Multimap
,而不保留数组。填充Multimap
需要按顺序进行,如果是并发的,则需要使用锁进行保护,但是读取可以是并发的,而不需要任何保护。您甚至可以在填充HashMultimap
后创建一个ImmutableMultimap
,以防止任何修改,这是并发环境中的一种安全做法。我检查了程序,不需要整数[],int[]可以工作。@blue OK,我编辑了答案以考虑到这一点。但是它有帮助吗?我检查了程序,不,我不需要整数[],int[]可以工作。@blue好的,我编辑了答案以考虑到这一点。但这有帮助吗?
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;
}
}