处理9M以上大文本转集合时第二次运行报System.OutOfMemoryException如何解决
异常诱因与解决方案
异常诱因
- 内存残留未释放:首次运行时加载的全量文本、中间替换生成的字符串、最终集合对象未被垃圾回收及时清理,第二次运行时重复加载相同量级的资源,总占用超过运行环境的进程内存阈值,触发内存溢出。
- 全量加载的设计缺陷:当前流程使用
Read All Text From File一次性将整份9M文件加载到内存,制表符替换步骤会再生成一份完整的文本副本,后续写入文件、再读取转集合的过程又两次重复加载全量数据,单轮运行内存占用就达到原始文件的3~4倍,重复运行时内存压力陡增。 - 冗余步骤额外消耗:将替换后的文本写入磁盘再读取转集合的步骤完全多余,额外增加了一次全量数据的内存占用,进一步放大了内存溢出的风险。
可行解决方案
- 移除冗余中间步骤:直接删除「Write Text File」写入本地文件的步骤,制表符替换后的文本直接传入
Get CSV Text As Collection接口生成集合,减少一次全量数据的内存占用和磁盘IO消耗。 - 改为逐行处理模式:放弃全量读取文件的逻辑,改用逐行读取的方式处理:每次仅读取一行文本,完成单行列分隔符替换后直接追加到集合中,全程内存仅保留当前处理行和最终集合,内存占用可降低90%以上,完全规避大文件全量加载的内存风险。
- 运行前强制回收内存:每次流程启动时先执行垃圾回收逻辑清理上一次运行的残留内存,例如在Power Automate Desktop中可添加执行C#代码的步骤,运行
GC.Collect(); GC.WaitForPendingFinalizers();强制释放闲置内存后再开始处理数据。 - 拆分大文件分批处理:如果上述优化仍不满足需求,可将8万多行的原始文件拆分为2~3个小文件,分别处理生成子集合后再合并为总集合,进一步降低单次处理的内存压力。
内容的提问来源于stack exchange,提问作者Yagami Light
相关产品推荐
相关产品推荐

