Saya menulis aplikasi .NET 4.5 yang mendukung data warna, inframerah, dan kedalaman dari Kinect v2, melakukan beberapa pemrosesan di atasnya, dan kemudian membuangnya ke disk, dalam bentuk yang tidak terkompresi; aplikasi .NET juga memulai ffmpeg sebagai subproses dan mem-pipe data warna untuk disandikan sebagai H.264.
Karena saya tidak menggunakan SSD, data video tiba lebih cepat daripada yang saya bisa tulis ke disk. Tapi tidak apa-apa, saya bisa membuang bingkai video ketika saya kekurangan RAM. Satu-satunya persyaratan saya adalah bahwa apa pun yang saya simpan sebagian besar bersebelahan 8--10 detik video. Jadi saya telah menambahkan beberapa logika dalam aplikasi .NET 4.5 saya untuk mulai membuang bingkai video ketika saya tidak memiliki cukup RAM untuk buffer berdampingan 8 hingga 10 detik video (sekitar 1,5 hingga 2 GB).
Dan, untuk mencegah meronta-ronta halaman, saya telah sepenuhnya menonaktifkan file paging. Ini membuat saya dengan total 16 GB RAM fisik.
Masalah saya adalah bahwa bahkan dengan mekanisme itu di tempat, kadang-kadang aplikasi .NET saya atau subproses ffmpeg masih terbunuh ketika Windows 8.1 panik tentang RAM yang rendah, karena jelas aplikasi saya menggunakan sebagian besar RAM ketika memiliki tumpukan besar data video untuk menulis ke disk. Apakah ada cara untuk memberi tahu Windows bahwa proses saya lebih penting daripada yang lain sehingga Windows akan mulai membunuh proses yang kurang penting lainnya terlebih dahulu?
CreateMemoryResourceNotification
yang jauh lebih sedikit peretasan.Jawaban:
Windows tidak mematikan proses ketika semua RAM digunakan. Apa yang sebenarnya terjadi adalah bahwa proses gagal mengalokasikan memori dan kerusakan.
Ini terjadi karena semua memori fisik Anda sedang digunakan dan karena file halaman dinonaktifkan, manajer memori tidak lagi memiliki kemampuan untuk menulis halaman yang tidak digunakan. Ini membuat RAM fisik Anda penuh dan ketika proses Anda, atau apa pun yang lain berjalan pada saat itu, mencoba mengalokasikan halaman, itu gagal. Beberapa aplikasi mogok.
Presentasi dari Technet ini menjelaskan: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
Pagefile menjaga aplikasi agar tidak mogok saat Anda menggunakan semua memori Anda dengan bertindak sebagai penghalang bagi komitmen berlebihan.
Memori virtual adalah dasar dari bagaimana sistem operasi modern mengalokasikan sumber daya, jadi itu semua tentang memiliki hal-hal dalam RAM yang sedang digunakan, dan memindahkan barang masuk dan keluar dari disk.
Sebenarnya hanya ada dua jawaban:
Intinya adalah bahwa RAM hanyalah tingkat cache yang lain, dan semua hal tentang memori virtual, pagefiles, file yang dipetakan memori, dan semua yang pada dasarnya bermuara pada ini: jika Anda kehabisan memori, Anda perlu menambahkan lebih.
sumber
Buka Panel Alat Windows & Pengaturan Lanjut & nonaktifkan hal-hal yang tidak diperlukan, seperti efek jendela jika Anda belum melakukannya, dan dapatkan Sysinternals Process Explorer & / atau Monitor Sistem untuk menemukan & mematikan segala hal asing yang menghabiskan CPU atau memori.
Lebih penting lagi, gunakan Process Explorer & / atau System Monitor untuk menonton ketika program Anda dieksekusi dan lihat di mana & bagaimana ia gagal. Utas mana yang kehabisan memori dan mati lebih dulu - prgm utama atau bagian ffmpeg? Apakah ada dll tertentu atau sumber daya bersama lainnya yang ukuran balonnya tidak terduga? Atau apakah eksekusi berjalan dengan benar, kecuali menggigit lebih dari yang bisa dikunyah dalam data?
Mencari tahu lebih tepat sifat masalah Anda kemungkinan akan mengarahkan Anda ke arah solusi. Anda bisa, misalnya, menerapkan kebijakan menjatuhkan bingkai Anda lebih agresif, sambil mengoptimalkan lebih baik untuk kriteria chunk 8-10 detik Anda untuk mencapai overhead RAM keseluruhan yang lebih rendah
Saran terakhir: Mungkin pertimbangkan untuk beralih ke Linux, dan sementara itu, aktifkan kembali file paging (linux menyebutnya ruang swap, yang membuatnya terdengar lebih menyenangkan, seperti swap-meet atau semacamnya!) Semoga beruntung.
sumber