2013-04-26 67 views
4

的大量好了,解释这个问题,问题...哪些数据结构,用来存储字符串

我:
充满了数以百万计的条目(一张大数据库表中的每个条目可具有“ n“列数量)。

的概念:(前“可用”和“选择”)

我想展现给一个网络接口两个列表。 当用户将条目从一个列表移动到另一个列表时,我需要将条目的unique-id(字符串类型)临时存储到我的服务器中名为“selected”的“未知数据结构”中,并且当用户最终点击提交我会将这个列表进一步传递给其他应用程序。

对数据库进行排序和筛选,然后将全部数据量(以块为单位)加载回java,然后检查每个条目是否被选中并将添加到将要去的列表中显示在Web界面中。

for each entry{ 
    if(selected.contains(currentEntry.ID)){ 
    selectedList.add(currentEntry) 
    }else{ 
    availableList.add(currentEntry) 
    } 
} 

名单selectedList和availableList将只持有几百项(那些显示给用户,以最大100-200条目约页)这样一类的列表“项”是不够好,持有我的排序。

问题:
结构“selected”必须包含数以千计的ID(有时可能达到百万)。

需要:
我需要快速访问来查找id是否存在(structure.contains(id)),所以我肯定会使用散列结构。 我需要使用最小内存资源的结构。

非需要:
不需要良好的删除性能。排序是不需要的。

+1

设置将是我认为最好的。 – 2013-04-26 12:23:06

+1

如果它必须保存这么多的条目,你应该将它转储到数据库表中,并附加一个额外的ID(例如某种类型的会话标识) – 2013-04-26 15:20:22

+0

经过大量测试后,我意识到所有的Hash结构(HashSet, LinkedHashMap等)执行大致相同。 TreeSet是我测试的性能较差的结构,需要最多的时间来查找和元素。 当我超过200.000个元素(当然,这与硬件等有关)时,我开始面临溢出到我的测试系统的问题。 我可能会去解决方案使用数据库表来保存选定的ID和直接从数据库使用连接获取数据(无论哪种方式我会使用数据库进行排序和过滤) 感谢您的帮助。 – Stef 2013-05-03 12:22:12

回答

1

经过大量测试后,我意识到所有的哈希结构(HashSet,LinkedHashMap等)的性能大致相同。

当我超过200,000个元素(当然,这与硬件等有关)时,我开始面临溢出到我的测试系统的问题。

我很可能会去使用一个数据库表来保存所选的ID,并使用连接获取从数据库中直接数据

感谢(我会用数据库进行排序和过滤或者方式)的解决方案@DariusX。为“获胜”的建议和其他人的帮助。

1

mybe你有快速访问像HashSet的东西。

1

可以使用TreeSet,javadoc中说,它“提供了保证的log(n)时间为基本操作成本(添加,删除和包含)”,如果你需要的东西链接到您的ID,使用HashMap

0

1.因为您需要持有数千个ID,所以HashMap是一个答案。如果密钥已知并且快速插入,它具有非常快的访问。

2.一般而言,treemap & hashmap不同步,但hashtable是同步的。同时,hashtable不允许空键或值。另一方面,hashMap允许一个空密钥。

3.您也可以去TreeMap,因为TreeMap允许我们按照用户定义的某种排序顺序检索元素。嗯,我认为TreeMap慢于HashMap

编辑: 阅读几篇文章,我碰到这个人来和后嗯..

说真的,你最好不要使用Hashtable 。对于单线程应用程序,您不需要额外的同步处理开销。对于高度并发的应用程序,偏执异步可能导致饥饿,死锁或不必要的垃圾收集暂停。像蒂姆·豪兰指出,你可以使用 ConcurrentHashMap的,而不是

,我就用ConcurrentHashMap

0

HashSet去应提供快速访问,并在大多数概率会不断地访问,但我想,如果可行的话,您可以运行样本测试来检查由于数百万条目和数据集性质而导致的冲突是否过高。

这肯定无法满足您的最佳内存要求,您希望将数百万条记录保存到Java内存中时的大小是多少?如果它的占用空间非常大(比如说1000的MB),则可能需要考虑分布式缓存或者考虑索引方法。

相关问题