.net - 并行 Foreach 内存问题

标签 .net multithreading plinq

我在 FileInfoCollection 中有一个文件集合(3000 个文件)。我想通过应用一些独立的逻辑(可以并行执行)来处理所有文件。

 FileInfo[] fileInfoCollection = directory.GetFiles();
 Parallel.ForEach(fileInfoCollection, ProcessWorkerItem);

但是在处理了大约 700 个文件后,我遇到了内存不足错误。我之前使用过线程池,但它给出了同样的错误。
如果我尝试在没有线程(并行处理)的情况下执行,它可以正常工作。

在“ProcessWorkerItem”中,我正在运行基于文件字符串数据的算法。此外,我使用 log4net 进行日志记录,并且在此方法中与 SQL 服务器进行了大量通信。

以下是一些信息,文件大小:1-2 KB XML 文件。我阅读了这些文件,该过程取决于文件的内容。它识别字符串中的一些关键字并生成另一种 XML 格式。关键字在 SQL server 数据库中(近 2000 字)。

最佳答案

那么,什么是ProcessWorkerItem做?您可以更改它以使用更少的内存(例如,流式传输数据而不是一次加载所有数据),或者您可能希望使用 this overload 明确限制并行度。和 ParallelOptions.MaxDegreeOfParallelism .基本上,您想避免尝试一次处理所有 3000 个文件:) IIRC,Parallel Extensions 会“注意到”您的任务是否受 IO 限制,并允许一次执行超过正常数量的数量 - 这不是真正的你想要这里,因为你也受内存限制。

关于.net - 并行 Foreach 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5961385/

相关文章:

javascript - 如何在 LabVIEW 中使用 IWebBrowser2 读取 Web 浏览器的隐藏文档值?

c# - .NET 实例化错误

c# - MonoTouch - UIDevice.CurrentDevice.Name - UTF8

java - Java 并行流中的异常传播

c# - 将此 foreach 循环转换为并行执行的正确 PLINQ 语法是什么?

c# - 特定的 plinq 查询

.net - 无法在 Visual Studio 2010 中以 .NET 2.0 为目标

java - Java 中的分布式序列 ID(长)生成器 - 有人可以验证此设计是否正确吗?

java - Semaphore 可以安全地使用双重检查锁定习惯用法吗?

c# - 使用 TPL 的推测执行