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

时间:2012-08-10 19:00:25

标签: java algorithm data-structures size space-efficiency

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

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

我目前的想法是将它们一个接一个地存储在char[]内(以节省RAM),并对它们进行排序以便更快地查找(我认为如果我将它们预分类,查找最快,那么我可以使用{ {3}}或binary搜索)。但是我不确定我应该如何编码 - 如果有人想要一个具有挑战性的谜题:这里就是......

顺便说一句:在娱乐/排序过程中暂时超出内存限制可能没什么问题,但不应该多久或多久。

谢谢!

更新

对于“我想知道具体细节”的人群(纠正我,如果我在Java细节中错了):源文件包含大约320 000个条目(所有ANSI文本),我真的想留(WAY!)低于64 MB的RAM使用率,数据只是我程序的一部分。以下是关于interpolation内存的一些信息。

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

  • 一个byte[],所有连接= 12 +长度字节
  • 一个char[],所有连接= 12 +长度* 2个字节
  • String = 32 +长度* 2个字节(是对象,有char[] + 3 int

所以我必须记住:

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

HashTable并不神奇 - 它有助于插入,但原则上它只是一个非常长的String数组,其中hashCode模数容量用作索引,数据存储在索引之后的下一个空闲位置并搜索如果在查找中找不到它,则为lineary。但对于Hashtable,我需要String本身和前12个字符的子字符串进行查找。我不想那样(或者我在这里想念什么?),对不起那些人......

3 个答案:

答案 0 :(得分:1)

我可能会使用缓存解决方案,甚至番石榴都可以。当然排序他们,然后二进制搜索。不幸的是我没有时间:(

答案 1 :(得分:1)

对于这种情况,听起来像HashTable将是正确的实现。

搜索是在恒定时间内完成的,刷新可以在线性时间内完成。

Java Data Structure Big-O(警告PDF)

答案 2 :(得分:1)

我自己编写了一个解决方案 - 但它与我发布的问题略有不同,因为我可以使用我没有发布的信息(下次我会做得更好,抱歉)。

我只是回答这个因为它已经解决了,我不会接受其他一个答案,因为它们并没有真正帮助解决内存限制(并且对我的口味有点不合适)。他们仍然得到了一个赞成,没有感情,感谢花时间!

我设法将所有信息分成两个长信(密钥完全位于第一个密码中)。前12个字符是一个ISIN,它可以压缩成长整数,因为它只使用数字和大写字母,总是以两个大写字母开头,以一个数字结束,可以从其他字符重建。所有可能值的乘积都会留下超过3位的余量。

我将源文件中的所有条目存储在long[](首先打包ISIN,第二个长度中的其他内容)中,并根据两个长片中的第一个对它们进行排序。

当我通过键进行查询时,我将其转换为long,进行二分搜索(我可以将其更改为插值搜索)并返回匹配的索引。值的不同部分可以通过所述索引检索 - 我从数组获取第二个长度,解压缩并返回所请求的数据。

结果:RAM使用率从~110 MB下降到<包括Jetty在内的50 MB(顺便说一句 - 之前我使用过HashTable),查找速度很快。