6
  1. If each of them is guaranteed to have a unique key (generated and enforced by an external keying system) which Map implementation is the correct fit for me? Assume this has to be optimized for concurrent lookup only (The data is initialized once during the application startup).
  2. Does this 300 million unique keys have any positive or negative implications on bucketing/collisions?
  3. Any other suggestions?

My map would look something like this

Map<String, <boolean, boolean, boolean, boolean>>
4

4 回答 4

3

其他建议?你打赌。

使用适当的键值存储,Redis是第一个想到的选项。当然,这是一个独立的过程和依赖关系,但在适当的系统设计方面,你会赢得很多时间。

应该有一个很好的理由让您将业务逻辑与同一进程内存中的多个数据结合起来,即使它是短暂的。我已经尝试过几次,但总是被证明是错误的。

于 2013-01-26T16:49:29.243 回答
3

我不会使用地图,这需要很多内存。特别是在你的情况下。将值存储在一个数据数组中,并将键存储在排序索引数组中。在排序后的数组中,您使用 binSearch 来查找键在 data[] 中的位置。

棘手的部分将是建立数组,而不会耗尽内存。

你不需要考虑并发,因为你只从数据中读取

进一步尽量避免使用字符串作为键。尝试将它们转换为长。
此解决方案的优点:保证搜索时间不超过 log n。即使在最坏的情况下,当键对哈希码产生问题时

于 2013-01-26T16:37:07.223 回答
0

在我看来,您可以简单地使用TreeMap,因为它的排序结构将为您O(log(n))提供数据搜索。此外,它是合格的方法,因为正如您所说,所有数据都将在启动时加载。

于 2013-01-26T16:54:28.333 回答
0

如果您需要将所有内容保存在内存中,那么您将需要使用一些旨在与这些大量元素一起使用的库,例如Huge collections。最重要的是,如果写入的数量很大,那么您还必须考虑一些更复杂的解决方案,例如非阻塞哈希映射

于 2013-01-26T17:13:34.603 回答