Napisałem aplikację .NET 4.5, która buforuje dane koloru, podczerwieni i głębokości z Kinect v2, wykonuje na nim pewne przetwarzanie, a następnie zrzuca je na dysk w nieskompresowanej formie; aplikacja .NET uruchamia także ffmpeg jako podproces i przesyła do niej kolorowe dane, które mają być zakodowane jako H.264.
Ponieważ nie używam dysku SSD, dane wideo docierają szybciej niż mogę zapisać na dysk. Ale to w porządku, dopuszczalne jest odrzucanie klatek wideo, gdy brakuje mi pamięci RAM. Moim jedynym wymaganiem jest to, aby cokolwiek trzymałem, to w większości ciągłe fragmenty wideo od 8 do 10 sekund. Dodałem więc trochę logiki do mojej aplikacji .NET 4.5, aby rozpocząć odrzucanie ramek wideo, gdy nie mam wystarczającej ilości pamięci RAM, aby buforować ciągłe 8 do 10 sekund wideo (około 1,5 do 2 GB).
Aby zapobiec przeładowaniu stron, całkowicie wyłączyłem pliki stronicowania. To daje mi 16 GB fizycznej pamięci RAM.
Mój problem polega na tym, że nawet przy takim mechanizmie czasami moja aplikacja .NET lub podproces ffmpeg wciąż giną, gdy Windows 8.1 obawia się o niską pamięć RAM, ponieważ oczywiście moja aplikacja używa najwięcej pamięci RAM, gdy ma ogromne zaległości danych wideo zapisywać na dysk. Czy istnieje sposób, aby powiedzieć systemowi Windows, że moje procesy są ważniejsze niż inne, aby system Windows najpierw zaczął zabijać inne mniej ważne procesy?
CreateMemoryResourceNotification
które jest o wiele mniej hackerskie.Odpowiedzi:
Windows nie zabija procesów, gdy cała pamięć RAM jest używana. W rzeczywistości procesy nie przydzielają pamięci i ulegają awarii.
Dzieje się tak, ponieważ cała twoja pamięć fizyczna jest używana i ponieważ plik stronicowania jest wyłączony, menedżer pamięci nie ma już możliwości zapisywania stron, które nie są używane. Dzięki temu fizyczna pamięć RAM jest pełna, a gdy proces lub cokolwiek innego uruchomionego w tym czasie próbuje przydzielić stronę, kończy się niepowodzeniem. Awaria niektórych aplikacji.
Ta prezentacja Technet wyjaśnia: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
Plik strony zapobiega awariom aplikacji po wykorzystaniu całej pamięci, działając jako zabezpieczenie przed nadmiernym zaangażowaniem.
Pamięć wirtualna jest właściwie podstawą tego, w jaki sposób nowoczesne systemy operacyjne przydzielają zasoby, więc chodzi o to, aby w pamięci RAM były używane rzeczy i przenosić je z dysku.
Tak naprawdę są tylko dwie odpowiedzi:
Najważniejsze jest to, że pamięć RAM to tylko kolejny poziom pamięci podręcznej, a wszystkie rzeczy związane z pamięcią wirtualną, plikami stron, plikami mapowanymi w pamięci i wszystko to w zasadzie sprowadza się do tego: jeśli kończy się pamięć, musisz dodać więcej.
źródło
Przejdź przez Panel narzędzi systemu Windows i ustawienia zaawansowane i wyłącz niepotrzebne rzeczy, takie jak efekty okien, jeśli jeszcze tego nie zrobiłeś, i uzyskaj Sysinternals Process Explorer i / lub Monitor systemu, aby znaleźć i wyłączyć wszystko, co marnuje procesor lub pamięć.
Co ważniejsze, użyj Process Explorer i / lub Monitora systemu, aby obserwować, jak program się uruchamia, i zobaczyć dokładnie, gdzie i jak się nie powiedzie. Który wątek zabraknie pamięci i najpierw umiera - główna część prgm czy ffmpeg? Czy istnieje konkretna biblioteka DLL lub inny udostępniony zasób, którego rozmiar nieoczekiwanie rośnie? A może wykonanie przebiega poprawnie, z wyjątkiem odgryzania większej ilości danych niż do żucia?
Dokładniejsze określenie natury problemu prawdopodobnie wskaże kierunek rozwiązania. Możesz na przykład bardziej agresywnie wdrożyć zasady pomijania klatek, optymalizując je lepiej pod kątem kryterium 8–10 sekund w celu uzyskania niższego całkowitego obciążenia pamięci RAM
Końcowe sugestie: Może warto rozważyć przejście na Linuksa, a tymczasem ponownie włączyć plik stronicowania (linux nazywa go przestrzenią wymiany, co sprawia, że brzmi to bardziej zabawnie IMHO, jak wymiana spotkań czy coś takiego!) Powodzenia.
źródło