【问题标题】:Fastest data structure for access/modification in JavaJava中用于访问/修改的最快数据结构
【发布时间】:2012-06-14 08:49:36
【问题描述】:

你好 Stackoverflowers!

当我想知道如果我必须访问/编辑大量数据时哪个是最快的数据结构可以让我获得最佳性能时,我正在编写一个项目?

让我用一个例子来解释。 我有一个名为 User 的类和一个类 Event。一个用户可以有很多事件。到目前为止,我已经用 ArrayList 实现了这种情况:

public class User{
    ArrayList<Event> events;
    public void process(){
    }
    ...
}
public class Event{
    event data like event time etc.
}

由于我有很多用户(数百万),每个用户都可能有数千个事件,此外,我必须使用 process() 方法访问用户的每个事件,我认为使用 HashMaps 等结构. 不会有帮助(如果错了请告诉我)。 但是,很明显,有了这么多的元素,就需要良好的性能。

那么,您认为处理事件最快的数据结构是什么?

非常感谢,

马可。

【问题讨论】:

  • 取决于您要如何处理事件。顺序重要吗?如果有,是FIFO还是LIFO数据结构?
  • 我宁愿把它委托给数据库
  • 我同意 LeleDumbo,如果你有数百万用户,它只是乞求数据库......
  • @m0skit0 不,我访问数据的顺序无关紧要,因为我必须访问每个事件
  • @MarcoGalassi:你需要随机访问这些事件吗?例如。 “给我 UID 0x69696969 的事件”?还是您只是将它们视为未分类的一堆?

标签: java performance data-structures


【解决方案1】:

这听起来像是更适合数据库的工作,特别是如果您想要持久性和/或您的数据可能不适合您计算机的主内存。

但是,如果您坚持在自己的代码中执行此操作,则可能需要查看 LinkedHashMap 类。它允许以恒定(即 O(1))复杂度直接访问其元素,同时还结合了内部链表以允许对所有元素进行快速迭代。

当然,HashMap 结构是否有用取决于您想要做什么。例如,如果您想根据某种标识符搜索事件,那么HashMap 是理想的选择。

另一方面,如果您只需要根据事件的插入顺序来访问事件,那么您将无法比ArrayList 做得更好,因为它支持以恒定复杂性对其内容进行索引访问。如果您只需要在队列或堆栈中处理它们,Java 有几个您可能感兴趣的Deque 接口实现。

最后,如果您想随机插入密钥并让底层结构自行排序,您可能会发现 TreeMap 类很有用。

【讨论】:

  • 我不认为使用数据库会解决性能问题。如果我使用数据库,我不是因为需要从中检索数据而产生额外的性能问题吗?我的意思是,如果我访问我机器上的数据而不是数据库,它应该真的更快。不是吗?
  • @MarcoGalassi:1. 您始终可以在同一主机上运行您的数据库。 2. 您确定您的数据将始终适合可用内存吗?如果你要使用磁盘,最好让数据库来做——它会比你做的好得多。 3. 您对持久性和连贯性的要求是什么?你需要交易吗?当你的程序终止时会发生什么。如果它崩溃了会发生什么?
  • @MarcoGalassi:我忘记了最重要的论点:在实际试用您的应用程序之前,您似乎假设存在性能问题。过早的优化是万恶之母——在你的分析器告诉你之前不要优化任何东西......
【解决方案2】:

有两件事:

1- 在当前场景中,如果并发用户不是问题,那么您可以轻松地使用 arraylist,因为它更快更简单的数据结构,否则如果并发用户是问题,那么您可以轻松地使用向量来存储您的事件。

2- 您可以使用队列 DS,这将帮助您进行动态操作,例如插入/删除,这比使用迭代器的 arraylist 和 vecotr 更快。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    如果您的数据适合主内存,那么您最好的解决方案是 java 集合和 普通数组(取决于随机访问的需要、顺序性、需要持久化更改或其他任何东西)如果您的数据增长超过单个系统内存,您将使用一些可集群的 no-sql 解决方案获得更好的性能(再次,选择正确的工具 取决于你喜欢用你的数据做什么)

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多