Java 存储大约200K SHA256哈希的最节省内存的方法

Java 存储大约200K SHA256哈希的最节省内存的方法,java,algorithm,data-structures,Java,Algorithm,Data Structures,我需要在内存中以二进制形式存储大约200000个SHA256哈希。 我的要求是, 数据结构应该是内存效率最高的 我将按排序顺序(插入顺序不重要)读回散列,因此,数据结构支持 词典阅读更好 如果可以比较同一类型的两个结构以找到其中的公共哈希,这将是一个加号(尽管不是强制性的) 以下是我考虑的数据结构 阵列: 数组似乎是最简单和内存效率最高的一种,但我不能使用数组,因为 我必须在读取数据时对其进行排序。数据结构本身不支持它 由于200K哈希不是一个硬限制,而且还可以超过这个限制,所以我在分配数组

我需要在内存中以二进制形式存储大约200000个SHA256哈希。
我的要求是,

  • 数据结构应该是内存效率最高的
  • 我将按排序顺序(插入顺序不重要)读回散列,因此,数据结构支持 词典阅读更好
  • 如果可以比较同一类型的两个结构以找到其中的公共哈希,这将是一个加号(尽管不是强制性的)
以下是我考虑的数据结构

阵列: 数组似乎是最简单和内存效率最高的一种,但我不能使用数组,因为

  • 我必须在读取数据时对其进行排序。数据结构本身不支持它
  • 由于200K哈希不是一个硬限制,而且还可以超过这个限制,所以我在分配数组长度之前不知道大小。这意味着我有时可能需要通过将数组的全部内容复制到新数组来调整数组的大小(同时在内存中保留新旧内容)
  • 压缩基数Trie(Patricia Trie?) 对于我的实现来说,压缩基数Trie似乎是最有希望的DS。但是一个快速的谷歌搜索显示了这个链接:它说基数尝试不是非常内存优化

    引用链接:

    我觉得很好。在需要时使用它们

    (4) 你不太在乎内存的使用

    我将一个简单的8位基数树与一些标准哈希表实现进行了比较,前者占用的内存大约是后者的十倍。然后,我将基数改为4位(每个字符只分为2部分),内存使用率提高了两倍。现在我想知道你是否还有更大的改进空间

    哈希表? 我知道哈希表不像基数树那样支持排序读取,但它们真的有这么多内存最优(比基数树好10倍)吗


    我仍然不明白/不确信,压缩基数Trie不是内存最佳数据结构吗?如果没有,哪种数据结构最适合我的需要

    如果基数trie是已知的最好的一个,那么有没有一个最优算法,它会比较两个基数,试图找出其中的公共散列


    附言:我在SO上发现了以下类似的问题,但它们并没有解决我的问题:

    :这篇文章没有太多像“不具建设性”这样封闭的信息,答案是关于寻找电话号码的增量。但是散列的增量没有帮助吗


    :这是关于存储键值映射的,答案是要求使用数据库。

    哪里是
    ArrayList
    ?您的阵列问题似乎相对容易解决。此外,数组包含引用,而不是实际的字符串,因此实际上并不是一次在内存中存储两个哈希。
    ArrayList
    与数组相同,只是它们的实现是抽象的。但是,必须进行阵列复制。是的,只有引用被复制了,但即使这样对我来说也太过分了,与其他结构相比,旧阵列上的200K和新阵列上的300K似乎有点太多了。a呢?你希望阵列多久更新一次?sha256二进制字符串为32字节。32*300000约为960万。即使你考虑8个额外的字节供参考(64位),它的40×300000=12M,这对我来说似乎并不多。在使用ArrayList时,您是否考虑过(这就是为什么问您希望它更新的频率)?@Codebender实际上没有太多内存。
    ArrayList
    在哪里?您的阵列问题似乎相对容易解决。此外,数组包含引用,而不是实际的字符串,因此实际上并不是一次在内存中存储两个哈希。
    ArrayList
    与数组相同,只是它们的实现是抽象的。但是,必须进行阵列复制。是的,只有引用被复制了,但即使这样对我来说也太过分了,与其他结构相比,旧阵列上的200K和新阵列上的300K似乎有点太多了。a呢?你希望阵列多久更新一次?sha256二进制字符串为32字节。32*300000约为960万。即使你考虑8个额外的字节供参考(64位),它的40×300000=12M,这对我来说似乎并不多。在使用ArrayList时,您是否考虑过(这就是为什么会问您希望它多久更新一次)?@Codebender这实际上并没有太多内存。