6

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

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

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

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

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

4

3 回答 3

7

嗯,有什么作用ProcessWorkerItem?您可以更改它以使用更少的内存(例如流式传输数据而不是一次全部加载),或者您可能希望使用此重载ParallelOptions.MaxDegreeOfParallelism. 基本上你想避免一次处理所有 3000 个文件 :) IIRC,如果你的任务似乎是 IO 绑定的,Parallel Extensions 会“注意到”,并允许一次执行超过正常数量 - 这不是真正的你想在这里,因为你的记忆力也是如此。

于 2011-05-11T08:36:39.910 回答
2

如果您尝试对大文件进行并行操作,那么您可能会耗尽可用内存。

也许考虑尝试Rx扩展并使用它的 Throttle 方法来控制/组合您的处理?

于 2011-05-11T08:38:39.910 回答
0

我发现了引发内存泄漏的错误,我将工作单元模式与实体框架一起使用。在工作单元中,我将上下文保存在一个哈希表中,其中线程名称作为哈希键。当我使用线程时,哈希表会不断增长,并且会导致内存泄漏。因此,我在工作单元中添加了其他方法,以在完成线程任务后从哈希表中删除元素。

public static void DisposeUnitOfWork()
        {
            IUnitOfWork unitOfWork = GetUnitOfWork();

            if (unitOfWork != null)
            {
                unitOfWork.Dispose();
                hashTable.Remove(Thread.CurrentThread.Name);


            }
        }
于 2011-05-12T10:50:59.353 回答