【问题标题】:Which data structure to use for storing big amount of strings使用哪种数据结构来存储大量字符串
【发布时间】:2013-04-26 12:21:02
【问题描述】:

好吧,解释一下问题......

我有:
一个包含数百万个条目的 Big DB 表(每个条目可能有“n”个列)。

概念:

我想向 Web 界面显示两个列表(例如“可用”和“已选择”)。 当用户将条目从一个列表移动到另一个列表时,我需要将条目的唯一 ID(字符串类型)临时存储到我的服务器中名为“selected”的“未知数据结构”中,并且当用户最终单击提交时我会将此列表进一步传递给其他应用程序。

在数据库中完成排序和过滤,然后将全部数据量(以块为单位)加载回java,然后检查每个条目是否被选中,并将其添加到将要被选中的列表中显示在网络界面中。

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

selectedList 和 availableList 列表将仅包含数百个条目(向用户显示的条目,大约是一个最多包含 100-200 个条目的页面),因此“条目”类型的列表足够好并且可以保存我的排序。

问题:
“选定”的结构必须包含数千个 id(有时可能达到数百万个)。

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

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

【问题讨论】:

  • 我认为最好设置。
  • 如果它必须包含这么多条目,您可能应该将其转储到数据库表中,并带有额外的 id(例如某种类型的 session-id)
  • 经过大量测试后,我意识到所有 Hash 结构(HashSet、LinkedHashMap 等)的性能大致相同。 TreeSet 是我测试过的性能较差的结构,需要最多的时间来查找和元素。当我超过 200.000 个元素时(当然这与硬件等有关),我开始面临测试系统溢出的问题。我可能会使用数据库表来保存选定的 id 并使用连接直接从数据库中获取数据的解决方案(无论我使用数据库进行排序和过滤的方式)谢谢您的帮助。

标签: java data-structures


【解决方案1】:

也许是你可以快速访问的东西,比如 HashSet。

【讨论】:

    【解决方案2】:

    您可以使用TreeSet,javadoc 说它“为基本操作(添加、删除和包含)提供有保证的 log(n) 时间成本”,如果您需要将某些内容链接到你的身份证,使用HashMap

    【讨论】:

      【解决方案3】:

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

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

      我可能会采用使用数据库表来保存所选 id 并使用连接直接从数据库中获取数据的解决方案(无论哪种方式我都会使用数据库进行排序和过滤)

      感谢@DariusX。感谢“获胜”的建议和其他所有人的帮助。

      【讨论】:

        【解决方案4】:

        1.既然你需要持有数千个 id,那么HashMap 就是一个答案。如果密钥已知和快速插入,它的访问速度非常快。

        2.一般treemaphashmap都是不同步的,但hashtable是同步的。同时,hashtable 不允许空键或空值。另一方面hashMap 允许一个空键。

        3.您也可以选择TreeMap,因为TreeMap 允许我们以用户定义的某种排序顺序检索元素。好吧,我认为TreeMapHashMap

        编辑: 好吧,在阅读了几篇文章后,我也遇到了这篇文章..

        说真的,你最好远离 Hashtable 共。对于单线程应用程序,您不需要额外的 同步的开销。对于高度并发的应用程序,偏执狂 同步可能导致饥饿、死锁或不必要的 垃圾收集暂停。就像 Tim Howland 指出的那样,您可以使用 改为 ConcurrentHashMap

        所以,我会选择ConcurrentHashMap

        【讨论】:

          【解决方案5】:

          HashSet 应该提供快速访问,并且很可能是恒定时间访问,但我认为如果可行,您可以运行示例测试以检查是否由于数百万个条目和数据集的性质而导致冲突太高.

          这肯定不会满足您的最佳内存需求,您期望在 Java 内存中保存数百万个条目的大小是多少?如果它的占用空间非常大(比如 1000 MB),您可能需要考虑分布式缓存,甚至考虑索引方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-15
            • 2016-12-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多