Mule 4:设计:如何在 Mule 4 中处理数据[文件/数据库记录]而不出现 "out-of-memory" 错误?
Mule 4 : Design : How to process data[files/ database records] in Mule 4 without getting "out-of-memory" error?
场景:
我有一个数据库,其中包含 100k 条记录,内存大小为 10 GB。
我的 objective 是
- 获取这些记录,
- 根据特定条件分离数据
- 然后为每组数据生成csv文件
- 将这些 CSV 文件写入 NAS(可通过同一网络访问的存储驱动器)
为了实现这一点,我想到的设计如下:
- 例如,使用每天上午 9 点触发流程的调度程序组件)
- 使用数据库select操作获取记录
- 使用批处理作用域
- 在批处理步骤中,在 Transform 消息中使用 reduce 函数,并以如下格式在聚合器中分离数据:
{
"group_1" : [...],
"group_2" : [...]
}
- 在完成批处理的步骤中使用文件组件将数据写入NAS驱动器中的文件
Questions/Concerns :
案例 1:从数据库读取时 select 它加载内存中的所有 100k 记录。
问题:如何优化此步骤,以便我仍然可以处理 100k 条记录,但内存使用量不会出现峰值?
案例 2:在分离数据时,我将分离的数据存储在 reduce 运算符中的聚合器对象中,然后该对象保留在内存中,直到我将其写入文件。
问题:有没有一种方法可以在批量聚合器步骤中分离数据并直接将数据写入文件并快速清理聚合器对象中的内存space?
请将其视为 Mule 4 流程的设计问题并帮助我。感谢社区的帮助广告支持。
- 不要在内存中加载 100K 条记录。在内存中加载大量数据可能会导致内存不足错误。您没有在配置中提供详细信息,而是在默认情况下提供数据库连接器 'streams' 页的记录,因此请注意。使用 fetchSize 属性调整每页读取的记录数。默认值为 10。批处理范围使用磁盘 space 来缓冲数据,以避免使用 RAM 内存。它还具有一些参数来帮助调整每个步骤处理的记录数,例如批处理块大小和批处理聚合器大小。使用默认值不会接近 100K 条记录。还要确保控制并发以限制资源使用。
请注意,即使减少所有配置,也不意味着处理时不会出现尖峰。任何处理都会消耗资源。这个想法是要有一个可预测的、可控的尖峰,而不是一个会耗尽可用资源的不受控制的尖峰。
- 这个问题不清楚。除了聚合器大小之外,您无法控制聚合器内存,但看起来它只保留最近的聚合记录,而不是所有记录。您对此有任何疑问还是这是一个理论问题?
场景: 我有一个数据库,其中包含 100k 条记录,内存大小为 10 GB。 我的 objective 是
- 获取这些记录,
- 根据特定条件分离数据
- 然后为每组数据生成csv文件
- 将这些 CSV 文件写入 NAS(可通过同一网络访问的存储驱动器)
为了实现这一点,我想到的设计如下:
- 例如,使用每天上午 9 点触发流程的调度程序组件)
- 使用数据库select操作获取记录
- 使用批处理作用域
- 在批处理步骤中,在 Transform 消息中使用 reduce 函数,并以如下格式在聚合器中分离数据:
{
"group_1" : [...],
"group_2" : [...]
}
- 在完成批处理的步骤中使用文件组件将数据写入NAS驱动器中的文件
Questions/Concerns :
案例 1:从数据库读取时 select 它加载内存中的所有 100k 记录。 问题:如何优化此步骤,以便我仍然可以处理 100k 条记录,但内存使用量不会出现峰值?
案例 2:在分离数据时,我将分离的数据存储在 reduce 运算符中的聚合器对象中,然后该对象保留在内存中,直到我将其写入文件。 问题:有没有一种方法可以在批量聚合器步骤中分离数据并直接将数据写入文件并快速清理聚合器对象中的内存space?
请将其视为 Mule 4 流程的设计问题并帮助我。感谢社区的帮助广告支持。
- 不要在内存中加载 100K 条记录。在内存中加载大量数据可能会导致内存不足错误。您没有在配置中提供详细信息,而是在默认情况下提供数据库连接器 'streams' 页的记录,因此请注意。使用 fetchSize 属性调整每页读取的记录数。默认值为 10。批处理范围使用磁盘 space 来缓冲数据,以避免使用 RAM 内存。它还具有一些参数来帮助调整每个步骤处理的记录数,例如批处理块大小和批处理聚合器大小。使用默认值不会接近 100K 条记录。还要确保控制并发以限制资源使用。
请注意,即使减少所有配置,也不意味着处理时不会出现尖峰。任何处理都会消耗资源。这个想法是要有一个可预测的、可控的尖峰,而不是一个会耗尽可用资源的不受控制的尖峰。
- 这个问题不清楚。除了聚合器大小之外,您无法控制聚合器内存,但看起来它只保留最近的聚合记录,而不是所有记录。您对此有任何疑问还是这是一个理论问题?