PDAclub.pl - Forum użytkowników technologii mobilnych
Windows Mobile (Classic, Professional, Standard), Windows Phone 6.x oraz 7/8.x/10 => Oprogramowanie PPC => Dla programistów => Wątek zaczęty przez: pajakgdynia w Luty 07, 2010, 16:14:33
-
Trochę ostatnio walczę z Supermemo. Jak zauważyłem aplikacja jest bardzo pamięcio-wymagająca (w czasie importu garbage collector zwalnia koło 5mega/s, pamięć powoli rośnie w tempie ok 1mega/s). Import nie udaje się z powodu błędu alokacji pamięci (która dochodzi do 32mega)
Czy ktoś orientuje się, z czego wynika takie ograniczenie pamięci? Czy jest to .net czy samo WM? (testowałem na paru różnych PDA z różnym rozmiarem RAMu: 64/128/256, WM 6.0/6.1, .net 2.0). Czy ograniczenie to da się jakoś ominąć systemowo?
Czy w .net przypisywanie NULL dla "niepotrzebnej" pamięci powoduje przyspieszenie zwalniania pamięci GC? Czy może trzeba dane czytać do statycznej pamięci zamiast do alokowanej dynamicznie?
-
Tak jest to limit dla jednego procesu i tego nie obejdziesz, mozna to obchodzic robiac aplikacje dzialajaca jako kilka procesow + komunikacja miedzy nimi (ale to jest rzezba). Prawde mowiac radze zmienic koncepcje dzialania programu bo 32MB to mimo wszystko sporo jak na wiekszosc mobilnych aplikacji.
Odnosnie zarzadzania pamiecia w .NET proponuje poczytac np. to:
http://blogs.msdn.com/mikezintel/archive/2004/12/08/278153.aspx (http://blogs.msdn.com/mikezintel/archive/2004/12/08/278153.aspx)
-
Pisząc w c++ albo czymś co daje kod natywny można zmapować pliczek i sobie go jako pamięci na dane używać. Coś niby taki swap indywidualnie dla aplikacji. System nie wrzuci go do tych 32MB przestrzeni adresowej procesu, tylko do innego obszaru - tego 1GB o którym w artykuliku jest mowa. Ale w net to raczej odpada, przynajmniej w naturalny sposób robione.
Odnośnie tych przypisań null - raczej to nic nie da. O co chodzi z tym wczytaniem do pamięci statycznej? W systemach GC wszystko raczej jest dynamiczne ...
-
w sumie mozna kombinowac roznie, ale wydaje mi sie ze wystarczy zmienic podejscie. Prawde mowiac nie widze logicznego zastosowania aby wszystko upychac w pamieci :) Nawet jak chcemy cos dopalic aby zminimalizowac "wolny" odczyt z kart SD mozemy zrobic jakies inteligentniejszy cache w pamieci, ale to i tak nie upychanie wszystkiego na sile...
-
jakby kogoś interesowało.. Bardzo dobry opis problemu jest na stronie:
http://www.codeproject.com/KB/mobile/VirtualMemory.aspx?msg=2869739 (http://www.codeproject.com/KB/mobile/VirtualMemory.aspx?msg=2869739)
To powinien wiedzieć kazdy programista pod WM :ohreally:
-
Niestety chyba jednak i każdy zaawansowany user powinien być świadomy, że WM wciska mu dll-ki w przestrzeń adresową procesów w tak bezsensowny sposób. :( XP też używa dll-ek które mają ten same fixup-y dla wszystkich aplikacji, ale nie w prywatnej przestrzeni VM procesu, tylko powyżej 2GB w standardowej konfiguracji systemu.