【发布时间】:2017-12-26 23:55:48
【问题描述】:
我必须访问一个包含 380,000 个条目的数据库。我没有对数据库的写访问权限,我只能读取它。我使用地图创建了一个搜索功能,可以按名字搜索用户。这是我的过程:
1 - 从数据库加载所有内容
2 - 将所有内容存储到Map<Charactere, ArrayList<User>>,根据用户名字的第一个字母使用字母来存储用户。
<A> {Alba, jessica, Alliah jane, etc ...}
<B> {Birsmben bani, etc ...}
当有人搜索用户时,我会使用输入的名字的第一个字母并使用map.get(firstletter),然后遍历 ArrayList 以查找所有用户。
地图 我猜想在内存中占用很大的空间(380,000 个用户对象)。我不得不增加堆大小 我想让它更快。使用名字作为地图的键,以使其更快(有很多人有相同的名字)。
我有两个解决方案:
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
这是一个客户数据库,其中包含通过电话联系我们的客户服务的客户。接听电话的人必须使用客户姓名(通常是名字,然后是姓氏)进行搜索。使用 Db 搜索速度太慢。我实施的解决方案已经快了很多(1/2 秒 vs 26 秒使用 db),但我想改进它。
【问题讨论】:
-
您是否假设一旦加载的数据将永远不会被其他人更改到数据库中?为什么需要缓存全部数据而不是最常用的数据?请解释问题域,很难理解为什么需要在内存中维护整个数据库的副本。如果是这样,您是否考虑过使用内存数据库?
-
我每 5 分钟刷新一次缓存。这是一个客户群,我不知道哪些名字是最常搜索的。我不必维护数据库的完整副本,只需保留用户的副本(名字、姓氏、id、文档列表)
-
该数据库中是否有任何最后修改的列?每 5 分钟获取 38 万条记录将非常昂贵。
-
您需要如何搜索数据?换句话说,什么是关键,你在寻找什么?即你会搜索名字,姓氏,名字+姓氏的记录吗? id 是唯一键吗?如果你有 2 个名字和姓氏相同的用户,那么你会返回什么?
-
我使用名字或名字、姓氏进行搜索。例如,“Jessica Alba”的搜索查询可以是“Alba, j*”或“Alb*, jess*”。我搜索特定用户以及与该客户相关的所有文档。客户通过他们的 id 来区分。他们是否有相同的名字/姓氏并不重要。我无权修改数据库。刷新缓存需要2秒。
标签: java caching arraylist hashmap