java - 字符串的内存和速度高效搜索

标签 java algorithm data-structures size space-efficiency

我有一堆 String 想要快速查找。每个字符串的长度为 22 个字符,仅由前 12 个字符(可以说是“键”)查找,整个字符串集会定期重新创建。它们从文件加载并在文件更改时刷新。我不得不处理可用内存太少的问题,我的 VPS 上的其他服务器进程也需要它,而且需要更多。

如何最好地存储字符串并搜索它们?

我目前的想法是将它们一个接一个地存储在 char[] 中(以节省 RAM),并对它们进行排序以加快查找速度(我认为如果对它们进行预排序,查找速度最快所以我可以使用 binaryinterpolation 搜索)。但我不太确定我应该如何编写代码 - 如果有人想玩一个具有挑战性的谜题:就在这里......

顺便说一句:在重新创建/排序期间超出内存限制一段时间可能没问题,但不应该超出太多或太长时间。

谢谢!

更新

对于“我想知道细节”的人群(如果我在 Java 细节上有误,请纠正我):源文件包含大约 320 000 个条目(所有 ANSI 文本),我真的很想留下来(WAY!) RAM 使用量低于 64 MB,数据只是我程序的一部分。这是关于 sizes of Java types 的一些信息在内存中。

我的 VPS 是 32 位操作系统,所以...

  • 一个 byte[],所有连接 = 12 + 长度字节
  • 一个char[],全部连接起来 = 12 + 长度 * 2 字节
  • String = 32 + length * 2 bytes (是Object,有char[] + 3 int)

所以我要记住:

  • ~7 MB 如果所有都存储在 byte[]
  • 如果全部存储在 char[]
  • 中,则约为 14 MB
  • 如果所有内容都存储在 String[]
  • 中,则约为 25 MB
  • > 40 MB,如果它们存储在 HashTable/Map 中(为此我可能需要微调初始容量)

HashTable 并不神奇——它有助于插入,但原则上它只是一个很长的 String 数组,其中 hashCode 取模容量用作索引,数据存储在索引后的下一个空闲位置并进行搜索如果在查找时找不到它,则为线性。但是对于哈希表,我需要字符串本身和前 12 个字符的子字符串以进行查找。我不想要那个(或者我在这里错过了什么?),抱歉,伙计们......

最佳答案

我可能会为此使用缓存解决方案,甚至 Guava 也可以。当然对它们进行排序,然后进行二分查找。不幸的是我没有时间:(

关于java - 字符串的内存和速度高效搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11907681/

相关文章:

java - Reactor 2.0 中的多线程 - 为什么我不能将信号输出到多个线程

c++ - 生产代码中的 LRU 实现

c# - 将字符串映射到整数的哈希

Java OOP 三角形的存在性

java - Android JSON 数据未解析为 ListView

algorithm - QuickSort 的迭代实现中的无限循环?

javascript - 寻找一个 FP 算法来从点分隔的字符串中组成对象

algorithm - 在二叉搜索树中找到第 k 个最小节点

c - fork.c :764: request for member `list' in something not a structure or union

java - Commons FTPClient 在上传大文件后挂起