在具有并行任务的Mono / C#中没有释放内存。如何解释分配?

时间:2013-12-15 05:53:55

标签: c# memory mono

我有一个内存不足的问题,当我使用并行任务时,Mono / C#似乎无法解决这个问题。

背景:我有一个数据处理密集型应用程序,它从文件中读取数据块。每个块都被读取为一个字节数组,该数组被传递给一个新的StreamReader实例,以便它可以被作为并行任务的线程使用/处理。在Microsoft CLR上,这非常有效,并且在处理此文件时内存保持在~200 MB以下。

然而,在Mono上,代替在整个文件处理过程中保持相同范围的进程的内存量,它会线性增加,直到超过32位地址空间限制后出现内存不足错误。我无法理解为什么,并试图解决这个问题。

我使用了探查器和堆镜头工具来弄清楚消耗了如此多的内存。看起来填充了来自文件块的数据的字节数组比它们应该保持的时间更长(尽管偶尔会收集),因此程序耗尽内存。我试图找出使用堆镜头分析器保留对它们的引用,但它列出了几个“未知”类型,我不知道这意味着什么。 enter image description here我已经尝试确保在使用后将所有内容都置于/设置为null,并且在MS运行时中显然可以收集它们。如果有人知道如何解释快照中的这些未知数或进一步诊断/解决这个问题,将不胜感激。作为参考,堆镜头屏幕视图和任务的代码片段如下所示。

 //Run parallel tasks: the enumerator in this foreach statement produces byte[] types
 //and feeds them to a stream reader that it "yields"
 Parallel.ForEach(FQP.GetStreamReaderForSequences(700000),FR =>
        {
 //next code bits that process the FR variable 
 //(which is a streamreader wrapping a byte[])
 ....
 //Now I dispose of the streamreader
 FR.Dispose();
 FR = null;
 //This didn't help, but ideally there should be no more references to the byte[] type here.
 GC.Collect();
 });

1 个答案:

答案 0 :(得分:1)

默认情况下,Mono会增加分区的大小,每个大小都会请求一个新任务。因此,如果在并行查询中枚举大型数据集,则内存不足。因此,您必须创建自己的自定义分区程序,如下所示:

http://msdn.microsoft.com/en-us/library/vstudio/dd997416(v=vs.100).aspx