Magda Urban

Magda Urban Student,
Politechnika
Wrocławska

Temat: "Out of memory exception" przy utworzeniu dużej tablicy z...

Cześć,

tworze kod w C# z wykorzystaniem biblioteki ILNumerics.Net. Potrzebuje stworzyć tablice double o wymiarach 10000x10000 a w niektórych przypadkach nawet wiekszej.

ILArray<Double> table = new ILArray<Double>(10000, 10000);

Kompilacja przebiega prawidłowo niestety podczas wykonywania kodu otrzymuje: "Exception of type 'System.OutOfMemoryException' was thrown.
Próbowałam powiekszyć stos pamieci uzywając editbin.exe na moim pliku exe niestety bezskutecznie.
Nie wiem czy to problem tego że C# przydziela tylko 1 MB dla stosu czy może biblioteki.
Może ktoś tworzył tablice ILArray w podobnych wymiarach z wykorzystaniem biblioteki ILNumerics.Net i wie jak poradzić sobie z problemem? Czy wogóle można utworzyć tablice o takich rozmiarach ?(według specyficacji biblioteki niby tak)

Pozdrawiam i dziekuje z góry
Magda
Stanisław P.

Stanisław P. Software designer

Temat: "Out of memory exception" przy utworzeniu dużej tablicy z...

Magda Urban:
Potrzebuje stworzyć tablice double o wymiarach 10000x10000 a w niektórych przypadkach nawet wiekszej.

A czy masz tyle pamięci dostępnej? Nawet zakładając że każdy element to będzie unboxowany double bez żadnych dodatkowych informacji, to taka tablica 10e5x10e5 zajmuje 762MB. Może czas sprawdzić, czy wszystkie dane muszą być cały czas w pamięci? Nie możesz tego obrabiać po kawałku? Ew. jak to jakaś elektrotechnika, czy coś w tym stylu, to może warto rozglądnąć się za implementacjami macierzy rzadkich?Stanisław Pitucha edytował(a) ten post dnia 22.04.09 o godzinie 23:29
Piotr Owsiak

Piotr Owsiak
projektant/programis
ta .NET
(freelance/contrator
), pragma...

Temat: "Out of memory exception" przy utworzeniu dużej tablicy z...

Tak jak pisze Stanisław, problemem będzie prawdopodobnie ilość pamięci wymagana przez program.
U mnie poniższy kod wykonał się poprawnie:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ILNumerics;

namespace ILNumericTest
{
class Program
{
static void Main(string[] args)
{
ILArray<Double> table = new ILArray<Double>(10000, 10000);

for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
table[i, j] = 13;
}
}
Console.WriteLine("End.");
Console.Read();
}
}
}


Co prawda zgodnie z obliczeniami Stanisława skonsumował ok. 762 MB pamięci.
Co ciekawe przy pierwszym uruchomieniu też dostałem OutOfMemoryException, ale zgaduję, że system nie nadążał ze zwalnianiem pamięci (swapowaniem na dysk), gdyż miałem otwartych sporo aplikacji i wysokie zużycie RAM'u.

Co do stosu, to tablice są traktowane jako tzw. "reference types" i przechowywane na stercie, a nie na stosie.

Najlepiej upewnij się, że masz wystarczającą ilość pamięci.
Może dla testów staraj się krokowo zwiększać rozmiar tablicy zamiast od razu 10000, wtedy będziesz widziała jakie jest zużycie RAM'u.

Dodatkowo polecam odpalić program w trybie Debug i zobaczyć gdzie dokładnie wyskakuje wyjątek. Może problem leży gdzie indziej :)

Następna dyskusja:

Pomoc przy projektowaniu we...




Wyślij zaproszenie do