使用double数组时内存泄漏

Gac*_*cek 5 c# memory-management

我有一部分代码可以在大型数组上运行double(至少包含大约6000个元素)并执行数百次(通常为800次).

当我使用标准循环时,像这样:

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
singleRow = someObject.producesOutput();
//...
// do something with singleRow
// ...
}
Run Code Online (Sandbox Code Playgroud)

内存使用量上升约40MB(从循环开始时的40MB到最后的80MB).

当我强制使用垃圾收集器在每次迭代时执行时,内存使用量保持在40MB的水平(上升是无关紧要的).

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
singleRow = someObject.producesOutput();
//...
// do something with singleRow
// ...
GC.Collect()
}
Run Code Online (Sandbox Code Playgroud)

但是执行时间要长3倍!(这很关键)

如何强制C#使用相同的内存区域而不是分配新内存?注意:我可以访问someObject类的代码,所以如果需要,我可以更改它.

Ste*_*dit 7

为什么要分配一个大的空,singleRow仅用于覆盖它?也许你应该传入数组来修改它的值.这将允许您重用它.

double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
    someObject.FillWithOutput(singleRow);
    //...
    // do something with singleRow
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果该方法有时填充少于6000个元素,则它可以简单地返回填充计数.或者,您可以使用a List<double>,这将允许调整大小.