我必须访问一个包含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秒),但我想改进它。
答案 0 :(得分:2)
恕我直言,我认为你不必将所有条目缓存在内存中,但其中一部分可能是:
答案 1 :(得分:0)
您的方法存在几个问题:
正确的做法是将用户数据导出到提供正确搜索功能的数据库引擎中。如果您有修改时间戳,或者您可以拦截更新并将其重新应用到您的搜索索引,则可以加快导出/提取速度。
您用于搜索的内容并不重要,现代系统上的简单数据库足够快。大多数还提供索引功能,以加快您的搜索速度。如果你想要一些可以嵌入你的应用程序并且专门用于搜索并解决上述问题的东西,我建议你使用Lucene。