ASP.NET naprawdę duże obiekty

0

Witam,

mam następujący problem:
Mam serwer z RAM 1GB (np. windows server 2003) i aplikację asp.net, która musi wczytać dużą ilość danych statycznych (3 tablice po 300 MB). Po wykonaniu na nich operacji, jeśli dane sa nieużywane 20 minut to są usuwane z pamięci;

Próbowałem to rozwiązać zmieniając wartość <sessionState timeout="bardzo dużo minut"> jednak nic się nie dzieje, dane ciągle trzymane są 20 minut. Jeżeli ustawiam we właściwościach IIS tą samą wartość - timeout - wtedy dane już są trzymane, ale np. po 50 minutach znowu mi je usunęło (IIS wersja 6.0); Ktoś może coś na to poradzić?

A może macie inne pomysły na rozwiązanie problemu? (głównie chodzi o to żeby dane były trzymane w pamięci dla szybkiego dostępu, inaczej aplikacja ładuje się strasznie długo..)

PS: niestety nie moge używać np. Serwera Stanu (session state server), czy innego, albo wsparcia baz danych (gość dla którego to robię był dość uparty pod tym względem). Najlepsze byłoby jakieś rozwiązanie programistyczne.

1

Napisz aplikację tak, aby nie wczytywała tylu danych.
Co to za dane, i co z nimi robisz? Pewno powinieneś poszukać lepszego algorytmu.

0

We właściwościach witryny w zakładce Home Directory gdzieś na dole będzie informacja o tym, której puli twoja aplikacja używa. Zlokalizuj ją w IIS w gałęzi Application Pools i we właściwościach, w zakładce Performance wyłącz/dostosuj Idle Timeout.
Jeśli idle timeout jest włączone, to po określonym czasie, gdy nie pojawią się żadne żądania, proces zostaje ubity(a wraz z nim zawartość pamięci - w tym sesji).

To tyle na temat problemu, a teraz:

Mam serwer z RAM 1GB (np. windows server 2003) i aplikację asp.net, która musi wczytać dużą ilość danych statycznych (3 tablice po 300 MB).

Jesteś pewny, że to konieczne? Czy to jakiś SQL? Może wystarczy założyć indeksy i doprowadzić do postaci normalnych.

0

Niestety wczytanie takiej ilości danych jest konieczne;

nie orientuję się co to dokładnie za dane, ale z tego co pamiętam to jakies dane z rentgena pacjenta (trójwymiarowa tablica danych statycznych 3x300MB), i obliczenia na nich prowadzone, czy wyniki wyświetlane bazują własnie na tych danych.

Dla SQL z bazy danych tworzona jest instancja obiektu strony asp.net i tam ładowane sa dane.
Próbowałem ustawień co do Application Poola i nie działało: po 50 minutach obiekt był już usunięty; zastanawiam się czy nie ma to raczej związku z tym, że te dane zajmują prawie całą pamięć; wtedy przy braku pamięci nawet jakby serwer miał sesję ustawioną na 50 000 min to i tak ubije proces (mam rację czy nie?)

1

Hej,

Nie jestem w stu procentach pewien, ale windows działa raczej tak, że gdy nie ma miejsca to robi zapis pamięci ram na dysk do pamięci wirtualnej, dopiero gdy w niej nie ma miejsca to system może zabić jakiś proces w celu ochrony "samego siebie". Który proces wybierze i w jakich okolicznościach - tutaj nie mam pojęcia.

Masz 1 GB ramu + pewnie ponad 1GB pamięci wirtualnej. Jeśli nie masz oprócz tej stronki innych obciążających procesów, to wątpię aby system sam usuwał dane z pamięci. Raczej będzie robił zrzuty pamięci na dysk i na nich operował (co jest mega wolne).

Po pierwsze sposób nakłonić osobę odpowiedzialną za serwer o dodanie ramu, przy dzisiejszych cenach... nie warto oszczędzać na sprzęcie. Na pewno odbije się to pozytywnie na wydajności serwera.

Z punktu widzenia programisty, również szukałbym innego rozwiązania, może zamiast pobierać dane z bazy -> budować obiekt -> przetwarzać go, warto zrobić operację w drugą stronę, obiekt przesłać do bazy i tam wykonać wszystkie operacje ?

0

Należy zauważyć, że dane wczytane mogą zająć w pamięci więcej miejsca niż na dysku. Zależy to od tego, co to są za dane, i jak są wczytywane. Chodzi mi w tym momencie o coś takiego, że np. zamiast przetwarzać obiekty Bitmap lepiej operować na byte[].

1 użytkowników online, w tym zalogowanych: 0, gości: 1