Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用随机访问文件的Guava多重映射?_Java_Io_Guava_Bigdata - Fatal编程技术网

Java 使用随机访问文件的Guava多重映射?

Java 使用随机访问文件的Guava多重映射?,java,io,guava,bigdata,Java,Io,Guava,Bigdata,我有一个整数[]s的文件太大,无法放入内存。我想搜索最后一个成员为x的所有数组,并在其他代码中使用它们。有没有一种方法可以使用Guava的multimap实现这一点,其中x是键并存储在内存中,整数[]是值并存储在磁盘上?在这种情况下,键不是唯一的,但键值对是唯一的。同时读取此多重映射(假设可能)。我也愿意接受其他方法的建议。 感谢您可以创建一个表示磁盘上数组的类(基于其在数组文件中的索引),我们将其称为FileBackedIntArray,并将其实例作为HashMultimap的值: 顺便问一下

我有一个整数[]s的文件太大,无法放入内存。我想搜索最后一个成员为x的所有数组,并在其他代码中使用它们。有没有一种方法可以使用Guava的multimap实现这一点,其中x是键并存储在内存中,整数[]是值并存储在磁盘上?在这种情况下,键不是唯一的,但键值对是唯一的。同时读取此多重映射(假设可能)。我也愿意接受其他方法的建议。

感谢

您可以创建一个表示磁盘上数组的类(基于其在数组文件中的索引),我们将其称为
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;
    }
}