主义批处理使用分离/清除

时间:2014-06-19 11:08:26

标签: entity-framework symfony doctrine-orm

我正在使用Doctrine进行批处理。我正在处理更多的实体。为了节省内存,我使用了可迭代的结果。在http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html上的示例中,Entity-Manager :: clear()或Entity-Manager :: detach在批处理操作中被调用。

如果我错了,请纠正我:

  • 如果您正在处理更大量的实体,实体将会 即使在批处理过程之后,也可以在Identity-Map内保持水分 完成。
  • 这可能会导致发出内存。
  • 没有分离/清除的iterableResults将消耗相同数量的内存,如保湿整个结果。
  • 为了节省记忆,你必须打电话给clear / detach

如果您不分离实体,如果您正在处理大量实体,则会遇到内存问题

如果您是独立运行批处理,没问题。但是,如果批处理是较大任务的一部分,则可能会导致问题。

E.g。在批处理之前使用该实体。在批处理期间,实体被分离,在批处理之后,实体将不会保存到db(如预期的那样)。

是否可以仅分离仅在批处理中使用而不在外部处理的实体?

是否有其他解决方案,而不是使用单独的实体管理器或在隔离环境中进行批处理。

我知道一般来说同步进行批处理是没有意义的。

1 个答案:

答案 0 :(得分:0)

唯一的解决方案是隔离批处理。在隔离环境中,您可以使用清除/分离,没有任何副作用。但是,如果处理大量实体,即使清除身份映射,内存消耗也会缓慢上升,取消设置所有实体并手动调用垃圾收集器。似乎是使用php和doctrine的价格。然而,这不是一个真正的问题。

如果您不在隔离环境中进行批处理,则分离(某些)实体/清除身份映射可能会导致市长问题。