Mam część kodu, która działa na dużych tablicach o wartości double
(zawierającej co najmniej 6000 elementów) i wykonuje kilkaset razy (zwykle 800).Wycieki pamięci przy użyciu macierzy podwójnej
Kiedy użyciu standardowego pętli tak:
double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
singleRow = someObject.producesOutput();
//...
// do something with singleRow
// ...
}
punkt Pamięć wzrasta użycia do około 40 MB (z 40 MB na początku działalności pętli, do 80 MB na końcu).
Kiedy zmuszam do korzystania z garbage collector do wykonania przy każdej iteracji, wykorzystanie pamięci pozostaje na poziomie 40MB (wzrost jest nieistotny).
double[] singleRow = new double[6000];
int maxI = 800;
for(int i=0; i<maxI; i++)
{
singleRow = someObject.producesOutput();
//...
// do something with singleRow
// ...
GC.Collect()
}
Ale czas wykonania jest 3 razy dłuższy! (jest to kluczowe)
Jak zmusić C# do korzystania z tego samego obszaru pamięci zamiast przydzielania nowych? Uwaga: Mam dostęp do kodu klasy someObject
, więc jeśli będzie to potrzebne, mogę to zmienić.
Chciałbym zobaczyć, co robisz z tablicą po jej uzyskaniu i jak działa productionOutput, jeśli to możliwe. –