使用随机存取文件的番石榴多图?

时间:2012-10-01 07:14:28

标签: java io guava bigdata

我有一个Integer [] s的文件太大而无法放入内存中。我想搜索具有x的最后一个成员的所有数组,并在其他代码中使用它们。有没有办法使用Guava的multimap来做到这一点,其中x是键并存储在内存中,Integer []是值并存储在磁盘上?在这种情况下,键不是唯一的,但键值对是唯一的。读取这个多图(假设它是可能的)将是并发的。我也对其他方法的建议持开放态度。
感谢

1 个答案:

答案 0 :(得分: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[],所以在任何地方使用ints都可以避免装箱/拆箱,并且由于你看起来有很多空间,所以会节省很多空间。希望你没有最后一个元素(x)的大量可能值。

然后,您为每个数组创建一个实例,并读取最后一个元素,将其放在Multimap而不保持数组。填充Multimap需要是顺序的,如果是并发的,则需要使用锁保护,但读取可以是并发的,没有任何保护。您甚至可以在填充ImmutableMultimap后创建HashMultimap,以防止任何修改,这是并发环境中的安全做法。