【问题标题】:Handling caching of very large set处理非常大的集合的缓存
【发布时间】:2015-05-25 15:29:10
【问题描述】:

我有一个 SetBigInteger 想要缓存。 这个 Set 可以达到~100K 的大小。

我正在使用的应用程序很轻:它没有很多内存(堆大约256mb)并且不使用数据库(团队正在考虑稍后,但现在不可能) .

在初始化时,它会收到 BigInteger 中的一个大 array,需要将其存储在 File 中以备将来使用。

然后应用程序需要检查特定的BigInteger 是否存储到给定文件中。

考虑到内存影响,我需要做什么才能有效地存储这些值,然后检查文件中是否存在给定值?

【问题讨论】:

  • 对它们排序并进行二分搜索。如果你想做一些花哨的事情,那么你可以使用 Btree。

标签: java file memory set


【解决方案1】:

假设每个 BigInt 占用 20 个字节。然后其中 100k 占用约 2MB,不到堆大小的 1%。希望它是您可以负担得起的仅保留在 RAM 中的东西。

我会对它们进行排序并放入一个数组中,然后使用binary search 来有效地检查特定值是否在数组中。

更新:数组是最紧凑的表示;仅在三个指针上,一棵树就会在每个项目上浪费 12 到 24 个字节。

【讨论】:

  • 20 字节比我对典型BigInteger 的预期要少得多。事实上,我什至不确定最小的 BigInteger 是否适合 20 个字节。
  • @LouisWasserman:仍然可能是一个显着的百分比。一个相当小的BigInteger 的有效负载可能是 16 字节(两个 64 位字),加上 4-8 字节的对象头(想想“VMT 指针”)。
【解决方案2】:

BigInt 的大小是variable,但您可以假设 100K BigInt 对象不会使用超过 10MB。存储它们以便快速搜索任何人的最简单方法是使用 TreeSet,它是 SortedSet 的实现。

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多