当前位置: 首页 > 面试题库 >

需要高效的内存存储方式来存储大量字符串(是:Java中的HAT-Trie实现)

诸彬郁
2023-03-14
问题内容

我正在使用一大组 (5-20​​百万个) 字符串键 (平均长度为10个字符)
,这些键需要存储在内存中的数据结构中,该数据结构在恒定时间或接近恒定时间内支持以下操作:

// Returns true if the input is present in the container, false otherwise
public boolean contains(String input)

就吞吐量而言,Java的Hashmap被证明是令人满意的,但占用了大量内存。我正在寻找一种内存效率高的解决方案,并且仍支持不错的吞吐量(与散列相当或几乎一样)。

我不在乎插入/删除时间。在我的应用程序中,我将仅执行插入操作(仅在启动时执行),随后将仅contains在应用程序生存期内使用该方法查询数据结构。

我读到HAT-Trie数据结构最符合我的需求。我想知道是否有一个实现的库。

欢迎提供其他有关实现建议的建议。

谢谢。


问题答案:

对于您的约束而言,特里树似乎是个好主意。

一种“框外思考”的替代方案:

如果您有能力为缺少的字符串回答“现在”的可能性

编辑:如果您可以负担得起误报,请使用WizardOfOdds在评论中建议的Bloom过滤器。

对于k = 1,Bloom过滤器就像没有键的哈希表:每个“
bucket”只是一个布尔值,它指示是否存在至少一个具有相同哈希值的输入。如果可接受1%的误报,则您的哈希表可以小到大约100 * 2000万比特或大约200 MiB。对于千分之一的误报,为2GiB。

使用多个散列函数代替一个散列函数可以提高相同数量位的误报率。



 类似资料:
  • 问题内容: 我目前有一个电子表格类型程序,该程序将其数据保存在HashMaps的ArrayList中。当我告诉您这还不理想时,您无疑会感到震惊。开销似乎使用的内存比数据本身多5倍。 这个问题询问有效的馆藏库,答案是使用Google馆藏。 我的跟进是“ 哪一部分? ” 。我一直在阅读文档,但感觉不像是哪种类最适合。(我也向其他图书馆或建议开放)。 因此,我正在寻找可以使我以最小的内存开销存储密集电子

  • 问题内容: 我存储了1.11亿个键值对(一个键可以有多个值-最多2/3),它们的键是50位整数,值是32位(最大)整数。现在,我的要求是: 快速插入(键,值)对[允许重复] 基于键快速检索一个或多个值。 这里基于MultiMap给出了一个很好的解决方案。但是,我想在主内存中存储更多键/值对,而不会降低性能。我从网络文章中研究到B +树,R+树,B树,紧凑多图等可以是一个很好的解决方案。有谁能够帮我

  • 问题内容: 我试图了解Java中的数组设置。创建数组后,为什么必须为数组中的每个对象初始化空间。它是如何存储在内存中的,如下所示: 或像这样: 换句话说,实际上是在内存中执行的操作。是否仅返回对内存中保留位置的引用,并且该语句沿10个指针的行创建内容,这些指针随后由新语句分配? 问题答案: 阵列,Java软件商店的两件事情之一:要么基本值(,,…)或引用(又名指针)。 因此,仅为10个引用创建空间

  • 我们在前两节已经了解了PHP中变量的类型和值是怎样在内核中用C语言实现的, 这一节我们将看一下内核是怎样来组织用户在PHP中定义的变量的。 有一点对我们扩展开发者来说非常棒,那就是用户在PHP中定义的变量我们都可以在一个HashTable中找到, 当PHP中定义了一个变量,内核会自动的把它的信息储存到一个用HashTable实现的符号表里。 全局作用域的符号表是在调用扩展的RINIT方法(一般都是

  • 卡桑德拉新手问题。我正在使用REST调用从社交网站收集一些数据。因此,我最终得到了以JSON格式返回的数据。 JSON 只是我的表中的列之一。我试图弄清楚存储JSON字符串的“最佳实践”是什么。 首先我想到使用map类型,但JSON包含字符串、数字类型等的混合。看起来我不能为map键/值声明通配符类型。JSON字符串可能非常大,可能超过10KB。我可以将其存储为字符串,但这似乎效率低下。我会假设这

  • 问题内容: 由于Redis尝试将字符串解析为64位带符号整数,因此存储32位带符号整数而不是基数10个整数字符串的二进制表示是个好主意吗? 在我们的系统中,我们列出了许多32位带符号整数ID。 问题答案: 在内部,Redis以最有效的方式存储字符串。将整数强制为基数10的字符串实际上会占用更多的内存。 这是Redis存储字符串的方式- 小于10000的整数存储在共享内存池中,并且没有任何内存开销。