Windows 8.1'de, RAM bittiğinde ilk işlemin öldürülmemesini sağlamanın bir yolu var mı?


18

Bir Kinect v2'den renk, kızılötesi ve derinlik verilerini arabelleğe alan, üzerinde bazı işlemler yapan ve sıkıştırılmamış biçimde diske döken bir .NET 4.5 uygulaması yazdım; .NET uygulaması da ffmpeg'i bir alt işlem olarak başlatır ve renk verilerini H.264 olarak kodlanacak şekilde aktarır.

SSD kullanmadığım için video verileri diske yazabileceğimden daha hızlı geliyor. Ama sorun değil, RAM azaldığında video karelerini atmak benim için kabul edilebilir. Tek şartım, tuttuğum her şeyin çoğunlukla 8-10 saniyelik video parçaları olması. Bu nedenle, bitişik 8 ila 10 saniyelik videoyu (kabaca 1,5 ila 2 GB) arabelleğe almak için yeterli RAM'e sahip olmadığımda .NET 4.5 uygulamamda video karelerini atmaya başlamak için bazı mantık ekledim.

Sayfanın bozulmasını önlemek için disk belleği dosyalarını tamamen devre dışı bıraktım. Bu bana toplam 16 GB fiziksel RAM bırakıyor.

Benim sorunum, bu mekanizma yerinde olsa bile, Windows 8.1 düşük RAM'den korktuğu zaman bazen .NET uygulamam veya ffmpeg alt işleminin hala öldürülmesidir, çünkü açıkçası benim uygulama video verilerinin büyük bir birikimine sahip olduğunda en fazla RAM kullanıyor diske yazmak. Windows'a süreçlerimin diğerlerinden daha önemli olduğunu söylemenin bir yolu var mı?


10
Ben pencerelerin süreçleri öldürdüğünü düşünmedim, bunun sadece linux özelliği olduğunu düşündüm.
Scott Chamberlain

4
@ScottChamberlain: Bunun nedeni, Windows'ta disk belleği dosyasını kapatmanın çok nadir olmasıdır. Size her türlü beklenmedik ve olağandışı davranış getirir. Buradaki açık yanıt "disk belleği dosyasını kapatmayın; Windows'u kullanılmayan verileri RAM'de tutmaya zorlar, böylece uygulamanız bu RAM'i kullanamaz"
MSalters

1
Bu bir StackOverflow sorusu olsaydı, size CreateMemoryResourceNotificationçok daha az hacky işaret edebilir.
MSalters

7
@Kal: Disk erişimi bir darboğazsa, daha güçlü bir sıkıştırma kullanın, CPU bir darboğazsa, daha hızlı bir sıkıştırma kullanın. Her ikisi de bir darboğazsa, tüm tasarımınızı yeniden düşünün ve baştan başlayın veya daha iyi bir donanım edinin.
Mooing Duck

1
@FactorMystic OMG ne yaptı? Sayfa dosyasını devre dışı bırakmak kullanılabilir RAM'inizi önemli ölçüde azaltacaktır.
Aron

Yanıtlar:


45

Tüm RAM kullanıldığında Windows işlemleri öldürmez. Aslında olan şey, işlemlerin bellek ve çökme tahsisi yapamamasıdır.

Bunun nedeni, tüm fiziksel belleğiniz kullanımda olması ve sayfa dosyasının devre dışı bırakılması nedeniyle bellek yöneticisinin artık kullanılmayan sayfaları yazma yeteneğine sahip olmamasıdır. Bu, fiziksel RAM'inizi dolu tutar ve işleminiz veya o sırada çalışan herhangi bir şey bir sayfayı ayırmaya çalıştığında başarısız olur. Bazı uygulamalar çöküyor.

Technet'in bu sunumu şöyle açıklıyor: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

PageFile, tüm anılarınızı aşırı taahhüt için geri döndürme işlevi olarak kullandığınızda uygulamaların çökmesini engelliyor.

Sanal bellek, modern işletim sistemlerinin kaynakları nasıl tahsis ettiğinin temelini oluşturur, bu yüzden tamamen RAM'de kullanılan şeylere sahip olmak ve diskten içeri ve dışarı hareket etmekle ilgilidir.

Gerçekten sadece iki cevap var:

  1. Disk dolmasını azaltmak için sayfa dosyasını yeniden etkinleştirin ve bilgisayarınızdaki RAM miktarını artırın.
  2. Uygulamanızın bellek gereksinimlerini azaltın.

Sonuç olarak, RAM sadece başka bir önbellek seviyesidir ve sanal bellek, sayfa dosyaları, bellek eşlenmiş dosyalar ve temelde buna inen tüm şeyler: belleğiniz biterse, eklemeniz gerekir Daha.


4
Veya daha az kullanın ....
nhgrif

1
Birikmiş işin biriktiğini lütfen unutmayın, çünkü veriler diske yeterince hızlı yazılamıyor. Aynı diskte sanal belleği etkinleştirmenin orada yardımcı olabileceğini sanmıyorum ...
Alexander

3
Aslında, sayfa dosyası diskte başka bir yerde olacaktır. Ve bunun bir SSD olmadığını bildiğimiz için, en yavaş disk işlemi olan fiziksel bir arama anlamına gelir.
MSalters

9
Uygulamanızda açık bellek yönetimine ihtiyacınız var gibi görünüyor ...
Joe

1
@Joe tam olarak bu. Çöp toplayıcı bu tür durumlarda bellek yönetimini bir kabus haline getirecektir. Bu tür bir durum, tüm bellek kullanımının ince ayarlı kontrolüne sahip olduğum için C ++ ile uğraşmak benim için önemsiz. C # 'da da bu durum için iyi çalışacak tasarım desenleri olmasına rağmen, çoğu insanın deneyeceği kadar basit değil.
Thebluefish

0

Windows Araç Paneli ve Gelişmiş Ayarlar'a gidin ve henüz yapmadıysanız pencere efektleri gibi gereksiz şeyleri devre dışı bırakın ve CPU veya bellek kaybına neden olan herhangi bir şeyi bulmak ve kapatmak için Sysinternals Process Explorer ve / veya Sistem Monitörü'nü alın.

Daha da önemlisi, programınız yürütülürken izlemek için Process Explorer ve / veya Sistem Monitörü'nü kullanın ve tam olarak nerede ve nasıl başarısız olduğunu görün. Hangi iş parçacığı bellek yetersiz ve önce ölür - ana prgm veya ffmpeg kısmı? Belirli bir dll veya beklenmedik şekilde boyut olarak balon paylaşılan başka bir kaynak var mı? Yoksa veriyi çiğneyebileceğinden fazlasını ısırmak dışında yürütme doğru mu ilerliyor?

Sorununuzun doğasını daha kesin olarak bulmak sizi bir çözüm yönünde gösterecektir. Örneğin, daha düşük toplam RAM ek yükü elde etmek için 8-10 saniyelik yığın ölçütünüz için daha iyi optimize ederken, çerçeve bırakma politikanızı daha agresif bir şekilde uygulayabilirsiniz

Son öneriler: Belki Linux'a geçmeyi düşünün ve bu arada, disk belleği dosyasını yeniden etkinleştirin (linux, takas alanı olarak adlandırır, bu da takas buluşması veya benzeri bir şey gibi IMHO'ya daha eğlenceli gelmesini sağlar!) İyi şanslar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.