【问题标题】:Mule 4 : Design : How to process data[files/ database records] in Mule 4 without getting "out-of-memory" error?Mule 4:设计:如何在 Mule 4 中处理数据[文件/数据库记录]而不会出现“内存不足”错误?
【发布时间】:2021-02-04 20:23:39
【问题描述】:

场景: 我有一个数据库,其中包含 100k 记录,其内存大小为 10 GB。 我的目标是

  • 获取这些记录,
  • 根据特定条件分离数据
  • 然后为每组数据生成csv文件
  • 将这些 CSV 文件写入 NAS(可通过同一网络访问的存储驱动器)

为了实现这一点,我的设计思路如下:

  • 例如,使用每天上午 9 点触发流程的调度程序组件)
  • 使用数据库选择操作来获取记录
  • 使用批处理范围
  • 在批处理步骤中,在 Transform 消息中使用 reduce 函数,并以如下格式分离聚合器中的数据:
{
   "group_1" : [...],
   "group_2" : [...]

}

  • 在批处理的完整步骤中,使用文件组件将数据写入 NAS 驱动器中的文件中

问题/疑虑:

案例 1:从数据库中读取时,选择它会将所有 100k 记录加载到内存中。 问题:如何优化这一步,以便我仍然可以处理 10 万条记录,但不会出现内存使用高峰?

案例 2:在分离数据时,我将隔离数据存储在 reduce 运算符中的聚合器对象中,然后该对象保留在内存中,直到我将其写入文件。 问题:有没有一种方法可以在批处理聚合器步骤中分离数据并直接将数据写入文件中,并快速清理聚合器对象空间中的内存?

请将其视为 Mule 4 流程的设计问题并帮助我。感谢社区的帮助广告支持。

【问题讨论】:

    标签: mule4


    【解决方案1】:
    1. 不要在内存中加载 100K 记录。在内存中加载大量数据可能会导致内存不足错误。您没有在配置中提供详细信息,但默认情况下数据库连接器“流式传输”记录页面,因此请注意。使用 fetchSize 属性来调整每页读取的记录数。默认值为 10。批处理范围使用磁盘空间来缓冲数据,以避免使用 RAM 内存。它还有一些参数可以帮助调整每一步处理的记录数,例如批处理块大小和批处理聚合器大小。使用默认值不会接近 100K 记录。还要确保控制并发以限制资源使用。

    请注意,即使减少所有配置,也并不意味着处理时不会出现尖峰。任何处理都会消耗资源。这个想法是要有一个可预测的、受控的峰值,而不是一个会耗尽可用资源的不受控制的峰值。

    1. 这个问题不清楚。除了聚合器大小之外,您无法控制聚合器内存,但看起来它只保留最近的聚合记录,而不是所有记录。您对此有任何疑问,还是这是一个理论问题?

    【讨论】:

    • 感谢您的回答。我只是在寻找优化我的解决方案。目前它没有给出任何错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多