在不使用太多内存的情况下加速搜索缓存

时间:2017-07-21 04:35:58

标签: java caching arraylist hashmap

我必须访问一个包含380,000个条目的数据库。我没有对DB的写访问权限,我只能读它。我使用地图创建了一个搜索功能,以按名字搜索用户。这是我的过程: 1 - 从DB加载所有内容 2 - 将所有内容存储到Map<Charactere, ArrayList<User>>,使用Alpha字母根据其名字的第一个字母存储用户。

<A> {Alba, jessica, Alliah jane, etc ...}
<B> {Birsmben bani, etc ...}

当有人搜索用户时,我会输入firstname的firstletter并使用map.get(firstletter),然后迭代ArrayList以查找所有用户。

地图我猜想在内存中占用很大的空间(380,000用户对象)。我不得不增加堆大小 我想让它更快。使用firstname作为Map的键,以使其更快(有许多人使用相同的名字)。

我有两个解决方案:

1 - Still use a map with firstname as key (increasing the heap size again?)
2 - Use files on the disk instead of Map (Alba.dat will contain all Alba for example) and open the right file for each search. No need to incease the heap size, but are there any side effects?

哪一个更好? (利弊)

Update with more info

这是一个客户数据库,通过电话呼叫我们的客户服务。接听电话的人必须使用客户名称(通常是firstname和lastname)进行搜索。使用Db太慢而无法搜索。我已经实现的解决方案已经快得多(使用db的1/2秒vs 26秒),但我想改进它。

2 个答案:

答案 0 :(得分:2)

恕我直言,我认为你不必将所有条目缓存在内存中,但其中一部分可能是:

  • 也许只使用环形缓冲区,或
  • 更复杂,更有意义的是,实现一个LFU缓存,它只保留N个最常访问的项目。有关如何实现此类缓存的提示,请参阅this question

答案 1 :(得分:0)

您的方法存在几个问题:

  • 这意味着用户数量不会改变,良好的应用程序设计可以在没有软件更改的情况下与任意数量的用户一起使用
  • 这意味着当前的问题是唯一的问题。如果需要实施的下一个要求是“按来电显示搜索”或“按邮政编码搜索”,会发生什么?
  • 它正在重新发明轮子,你现在开始从头开始编写数据库,索引或信息检索解决方案(但是你想要命名)

正确的做法是将用户数据导出到提供正确搜索功能的数据库引擎中。如果您有修改时间戳,或者您可以拦截更新并将其重新应用到您的搜索索引,则可以加快导出/提取速度。

您用于搜索的内容并不重要,现代系统上的简单数据库足够快。大多数还提供索引功能,以加快您的搜索速度。如果你想要一些可以嵌入你的应用程序并且专门用于搜索并解决上述问题的东西,我建议你使用Lucene。