【问题标题】:Best Practices to hold data in collection for batch processing in Java在 Java 中保存数据以进行批处理的最佳实践
【发布时间】:2015-09-08 19:44:59
【问题描述】:

我有一个生成记录的数据生成代码,每条记录都有多个用户选择的字段。为了加快进程,我将任务拆分为批量创建记录,并行创建记录

例如:如果我想生成 10k 条记录,我将其拆分为 5 个任务

喜欢说

 Task 1 : create record from 1-2k

 Task 2 : create record from 2001-3k

 ...

 Task 5 : create record from 8001-10k

我希望每个线程都将记录存储在容器中。当容器被填充到初始 1k 条记录的限制时,一个等待导出数据的任务将开始按顺序删除记录。

我的选择是使用 Hash Map,因为序列很重要,但它根本没有内存效率,因为即使 Map 为空超过 50%,Map 在堆上占用的大小保持不变,直到 Map 为 GC。

那么考虑到我的上述情况,什么最适合容器?

【问题讨论】:

  • HashMap 不保留序列。为什么不使用数组?
  • 我在 HashMap 中添加索引作为键
  • 那么为什么不使用以索引为隐式键的数组呢?
  • 也在数组中,如果我开始删除对象,内存不会被释放。只有GC时才会释放

标签: java multithreading memory collections


【解决方案1】:

【讨论】:

  • 我更喜欢容器而不是批处理
【解决方案2】:

当您谈论大尺寸时,将记录存储在内存中并不是一个好习惯。当您批量检索数据时,将数据推送到持久性 dB 存储。 如果您为数据保留索引 ID,则可以从那里处理存储的顺序。

如果您热衷于使用 Hashmap : 您可以在初始化对象时指定负载比率。这限制了底层哈希表中未使用的空间量。当然,限制这个未使用的空间会导致性能下降,因为在哈希表中会有更多的冲突。 您还必须调整您的 GC,看看这个-

http://www.cubrid.org/blog/dev-platform/how-to-tune-java-garbage-collection/][1]

但我仍然建议按照之前的建议修改您的设计

【讨论】:

  • 我们将其存储到持久性数据库中以防检索频率较低,例如每 5 秒 1 条记录
【解决方案3】:

您可能不需要关心垃圾收集器。只有在调用垃圾收集器时才会释放所有内存 - 它永远不会提前释放。如果您的程序在功能上是正确的并且没有保留对未使用数据的任何引用,那么垃圾收集器将清理所有未使用的对象。

在此处查看此问题:

confusion-over-how-javas-garbage-collector-works-nodes-queue

您可以使用数组来存储对对象的引用。如果用新引用覆盖引用,则数组中的旧对象将被垃圾收集器收集。否则,您将不得不丢弃数组或手动将任何未使用的引用设置为 null 以允许 GC 重用这些引用。

您可以使用ArrayList,在这种情况下,您可以调用clear() 来清空它并释放引用。或者您可以将ArrayList 扔掉并重新分配它。

另外,请看这里:java-collections-and-garbage-collector

如果您真的想避免分配和重新分配内存,您将不得不担心重用保存单个记录的对象,这可能会非常困难,而且可能无论如何也没有效果。

【讨论】:

    【解决方案4】:

    ArrayList 是一个不错的选择。 ArrayList 有 remove 方法,应该用来删除你的对象。 ArrayList clear() 方法也会有所帮助。但是,正如您所指出的,您将不得不等待 GC。

    最节省内存的方法是使用原始数据类型,如字符数组和整数数组。这是因为 Java 中的原始数据类型是唯一不被垃圾回收的。

    are java primitives garbage collected

    在 Java 中,除了原始元素之外的所有东西都是对象。并且所有对象在实例化时都有内存分配,没有被释放但有资格进行垃圾收集的选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-27
      • 2015-03-12
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多