Java - 在巨型列表中追加和删除的最佳策略?

标签 java performance list

使用Java

我记录一些小对象用于一些计算等,我只需要最后 x 千个。所以我想将第一个释放给垃圾收集器。但是因为从 ArrayLists 中删除是昂贵的......

以下很重要(不能改)

  • 没有数据库
  • 对象是同一类型
  • 每秒最多 50,000 个对象
  • 性能很重要
  • 快速遍历整个列表很重要
  • 随机访问也很重要

这是可以改变的:

  • 现在正在使用 ArrayList<MyObject>
  • 限制:100,000 个对象(停止记录,但必须继续)

我的猜测:

  • 链表
  • 环形缓冲区
  • ???

我怎样才能快速迭代并同时快速释放旧对象?

最佳答案

解决方案

... 如果您需要恒定数量的最后元素,只需使用数组作为环形缓冲区的基础。

  • 单一分配

  • 没有获取/放置/等。内联时的方法开销

  • 简单

示例(可能无法编译,即时编写)实现:

class LastElementsStore<T> {
  Object[] arr;
  int size;
  int nextPutIndex;

  LastElementsStore(int size ) {
    arr = new Object[size];
    this.size = size;
  }

  void put(T elt) {
    arr[nextPutIndex] = elt;
    nextPutIndex++;
    if (nextPutIndex == size) {
      nextPutIndex = 0;
    }
  }

  // getters of your choice

}

如果没有足够的元素,将返回空值。

如果你需要他们排序,你从 nextPutIndex 开始,读到最后,然后到 0 继续读。

您可以完全控制内存,不会像 LinkedList 那样进行额外的节点分配,也不会像 ArrayList 那样调整大小。

旧对象会在您达到限制后自动释放

您的要求

  • 没有数据库 -- 完成了,只是使用了一个数组

  • 对象是同一类型——简单模板

  • 每秒最多 50,000 个对象——如果一个数组不能处理它,Java 中的任何东西都不能处理

  • 性能很重要 -- 如上所述,访问数组时没有额外的开销 快速遍历整个列表很重要——尽可能快地进行迭代

  • 随机访问也很重要——数据是有序的,nextPutIndex 处/之后的第一个非空元素是第一个可用的

关于Java - 在巨型列表中追加和删除的最佳策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056913/

相关文章:

java - 如何声明可以包含另一个元素或仅包含文本的元素

java - 在程序中添加 for 循环时遇到问题

在 IE 中使用 'not' 的 JQuery 性能问题

list - OCaml:交换列表中的元素

python - 如何使用 SWIG 将 C++ 数组转换为 Python 列表?

linux - 如何使用 bash 粘贴来自不同文件的列?

java - 当一个线程在保留锁时调用signal(),而另一个线程在await()中,谁会进入CS?

java - Google App Engine 实体集合属性的限制

c++ - 由于Hackerrank中的超时而终止(在cpp中使用malloc)

performance - Visual Studio Web 性能测试 - 我可以让非编码的 Web 测试并行执行请求吗