我正在处理大量数据库记录,每个记录都有一个唯一的密钥。
由于我的数据库的性质,我的处理方法可能会遇到相同的密钥两次,因为它是关系数据库,而一条记录可能有多个“父”记录。
浪费宝贵的时间,处理能力,内存和文件大小来多次处理记录。因此,我需要一种方法来记录我已经处理过哪些ID。
我看过HashTable,因为它是获取和放置函数的O(1),而这些是我需要的唯一函数。然而,基本上存在(1000 +)/ Load Factor内存块实际上存储布尔值似乎是浪费内存。另外,我不知道我想要的容量,并且必须忍受大量的重复或分配比我需要的更多的内存。
我认为我正在寻找一种数据结构,你可以为它添加一个值,如果id已经存在于集合中,它会产生某种错误,比如从put(T value)
方法返回false。
答案 0 :(得分:4)
首先,听起来你想要一套,而不是一张桌子。
其次,如果你想要O(1),你唯一的选择是HashSet,带有内存开销。如果你愿意使用O(log(n)),那么TreeSet可以正常工作,无需开销。
第三,如果元素已经存在,则set的add(T t)将返回false。听起来像你真的想要一套而不是一张桌子。
O(log(n))仍然非常快。它当然不是O(1),但它不是太破旧。您只需要决定(可能经过一些测试)哪一个适合您。
答案 1 :(得分:2)
我认为HashSet是您正在寻找的: http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html
答案 2 :(得分:1)
你可以使用Bloom filter而不是hashmap。这是一个概率数据结构.Bloom过滤器的问题是它会给出false + ve。检查这个implementation of bloom filter。将是一个比hashmap更高效,更快速的解决方案。
有关Bloom过滤器的更多信息:
答案 3 :(得分:0)
嘿 既然您正在使用数据库,那么您是否只能将此信息存储在辅助数据库表中或与记录一起存储?此外,如果您正在使用树结构(因为您正在谈论父项),为什么不使用树遍历算法来标记已处理的节点。 在Breadth First Search/Depth First Search Animations和BFS上查看这些DFS及其中的Wikipeadia条目。
一般情况下,我会确保使用Object / Row跟踪处理标志。而不是单独的数据结构。
答案 4 :(得分:0)
如果正确排序了结果集,您是否可以将“上次处理”的ID保留在内存中?这样,你只需检查“当前id”与“最后一个id” - 如果它们不同,则处理掉,否则跳到下一条记录?