【发布时间】:2012-08-10 19:00:25
【问题描述】:
我有一堆Strings 我想快速查找。每个字符串的长度为 22 个字符,仅由前 12 个字符(可以说是“键”)查找,并且会定期重新创建完整的字符串集。它们从文件中加载并在文件更改时刷新。我必须处理太少的可用内存,我的 VPS 上的其他服务器进程也需要它并且需要它更多。
如何最好地存储字符串并搜索它们?
我目前的想法是将它们一个接一个地存储在 char[] 中(以节省 RAM),并对它们进行排序以便更快地查找(我认为如果我将它们预先排序,则查找速度最快,因此我可以使用 binary或interpolation 搜索)。但我不完全确定我应该如何编码 - 如果有人想要一个具有挑战性的难题:这里是......
顺便说一句:在娱乐/排序期间超出内存限制一段时间可能是可以的,但不应过多或过长时间。
谢谢!
更新
对于“我想知道细节”的人群(如果我在 Java 详细信息中有错误,请纠正我):源文件包含大约 320 000 个条目(所有 ANSI 文本),我真的很想留下来(WAY!)低于 64 MB 的 RAM 使用率,数据只是我程序的一部分。以下是内存中sizes of Java types 的一些信息。
我的 VPS 是 32 位操作系统,所以...
- 一个
byte[],全部连接 = 12 + 长度字节 - 一个
char[],全部连接 = 12 + 长度 * 2 个字节 -
String= 32 + 长度 * 2 字节(是 Object,有char[]+ 3int)
所以我必须记住:
- ~7 MB 如果全部存储在
byte[]中 - ~14 MB 如果全部存储在
char[] - ~25 MB 如果全部存储在
String[]中 - > 40 MB,如果它们存储在 HashTable / Map 中(我可能需要微调初始容量)
HashTable 并不神奇 - 它有助于插入,但原则上它只是一个非常长的 String 数组,其中 hashCode 模容量用作索引,数据存储在索引之后的下一个空闲位置并被搜索如果在查找时找不到它,则为线性。但是对于哈希表,我需要字符串本身和前 12 个字符的子字符串进行查找。我不想要那个(或者我在这里错过了什么?),对不起,伙计们......
【问题讨论】:
-
如果您(一次)只根据您所面临的一个狭窄问题(例如:内存使用、排序算法、数据结构)提出一个问题,这将有所帮助。
-
哈希表有什么问题吗?另外,您的性能是否受到限制?
-
我没有性能限制,但它仍然不应该花太长时间。 HashTable 对我不起作用(请参阅上面的更新)。
-
@AaronKurtzhals:我认为这不会有帮助,因为决策会相互影响。但我希望关于我的限制的其他信息会有所帮助。
-
您对哈希表的厌恶很难理解。事实上,除非哈希码是退化的,否则它们对于插入和查找都是 O(1)。
标签: java algorithm data-structures size space-efficiency