mule4 - Mule 4:设计:如何在 Mule 4 中处理数据[文件/数据库记录]而不会出现“内存不足”错误?
问题描述
场景:我有一个数据库,其中包含100k条记录,内存大小为 10 GB。我的目标是
- 获取这些记录,
- 根据特定条件隔离数据
- 然后为每组数据生成csv文件
- 将这些 CSV 文件写入 NAS(可通过同一网络访问的存储驱动器)
为了实现这一点,我的设计思路如下:
- 例如,使用每天上午 9 点触发流程的调度程序组件)
- 使用数据库选择操作来获取记录
- 使用批处理范围
- 在批处理步骤中,在 Transform 消息中使用 reduce 函数,并以如下格式分离聚合器中的数据:
{
"group_1" : [...],
"group_2" : [...]
}
- 在批处理的完整步骤中,使用文件组件将数据写入 NAS 驱动器中的文件中
问题/疑虑:
案例 1:从数据库中读取时,选择它会将所有 100k 记录加载到内存中。问题:如何优化这一步,以便我仍然可以处理 10 万条记录,但不会出现内存使用高峰?
案例 2:当分离数据时,我将隔离数据存储在 reduce 运算符中的聚合器对象中,然后该对象保留在内存中,直到我将其写入文件。问题:有没有一种方法可以在批处理聚合器步骤中分离数据并直接将数据写入文件中,并快速清理聚合器对象空间中的内存?
请将其视为 Mule 4 流程的设计问题并帮助我。感谢社区的帮助广告支持。
解决方案
- 不要在内存中加载 100K 记录。在内存中加载大量数据可能会导致内存不足错误。您没有在配置中提供详细信息,而是默认情况下数据库连接器“流式传输”记录页面,因此请注意。使用 fetchSize 属性来调整每页读取的记录数。默认值为 10。批处理范围使用磁盘空间来缓冲数据,以避免使用 RAM 内存。它还有一些参数可以帮助调整每一步处理的记录数,例如批处理块大小和批处理聚合器大小。使用默认值不会接近 100K 记录。还要确保控制并发以限制资源使用。
请注意,即使减少所有配置也不意味着处理时不会出现尖峰。任何处理都会消耗资源。这个想法是要有一个可预测的、受控的峰值,而不是一个会耗尽可用资源的不受控制的峰值。
- 这个问题不清楚。除了聚合器大小之外,您无法控制聚合器内存,但看起来它只保留最近的聚合记录,而不是所有记录。您对此有任何问题,还是这是一个理论问题?
推荐阅读
- javascript - 如何将角度材料步进形式的数据发布到 Node.Js 后端
- xml - 如何评估 xsl:if 的数字?
- python - 熊猫数据框。将元组值扩展为具有多索引的列
- javascript - 如何遍历字符串并检查是否有不匹配的字母
- python - 创建一个 GUI 来使用 Tkinter 和 OpenCV 扫描 QR 码?
- python - Python 自省:mro() 方法在哪里?
- c# - 按钮未将变量传递给控制器
- javascript - 如何删除重复项并计算两个数组之间的差异?
- .net - Visual Studio 2017 中的 Nuget 包错误
- sql-server - 将列值分配给 mssql 中的变量