Tôi đã viết một ứng dụng .NET 4.5 để đệm dữ liệu màu, hồng ngoại và độ sâu từ Kinect v2, thực hiện một số xử lý trên nó và sau đó đưa nó vào đĩa, ở dạng không nén; ứng dụng .NET cũng khởi động ffmpeg dưới dạng một quy trình con và chuyển dữ liệu màu tới nó để được mã hóa thành H.264.
Vì tôi không sử dụng SSD, dữ liệu video đến nhanh hơn tôi có thể ghi vào đĩa. Nhưng không sao, tôi có thể loại bỏ các khung hình video khi tôi thiếu RAM. Yêu cầu duy nhất của tôi là bất cứ điều gì tôi giữ hầu hết là các đoạn video dài từ 8 đến 10 giây. Vì vậy, tôi đã thêm một số logic trong ứng dụng .NET 4.5 của mình để bắt đầu loại bỏ các khung hình video khi tôi không có đủ RAM để đệm liên tục 8 đến 10 giây video (khoảng 1,5 đến 2 GB).
Và, để ngăn chặn việc đập trang, tôi đã tắt hoàn toàn các tệp hoán trang. Điều này để lại cho tôi tổng cộng 16 GB RAM vật lý.
Vấn đề của tôi là ngay cả khi có cơ chế đó, đôi khi ứng dụng .NET hoặc quy trình con ffmpeg của tôi vẫn bị giết khi Windows 8.1 phát cuồng về RAM thấp, vì rõ ràng ứng dụng của tôi đang sử dụng nhiều RAM nhất khi dữ liệu video tồn đọng rất lớn để ghi vào đĩa. Có cách nào để nói với Windows rằng các quy trình của tôi quan trọng hơn các quy trình khác để Windows bắt đầu tiêu diệt các quy trình ít quan trọng khác trước không?
CreateMemoryResourceNotification
nó ít hack hơn nhiều.