Trong Windows 8.1, có cách nào đảm bảo một quy trình không phải là lần đầu tiên bị giết khi hết RAM không?


18

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?


10
Tôi không nghĩ các cửa sổ đã giết các tiến trình, tôi nghĩ đó chỉ là một tính năng của linux.
Scott Chamberlain

4
@ScottChamberlain: Đó là vì tắt tệp hoán trang trên Windows là rất hiếm. Nó giúp bạn có tất cả các loại hành vi bất ngờ và bất thường. Câu trả lời rõ ràng ở đây là "không tắt tệp hoán trang; buộc Windows phải giữ dữ liệu không sử dụng trong RAM để ứng dụng của bạn không thể sử dụng RAM đó"
MSalters

1
Nếu đây là một câu hỏi StackOverflow, tôi có thể chỉ cho bạn biết CreateMemoryResourceNotificationnó ít hack hơn nhiều.
MSalters

7
@Kal: Nếu truy cập đĩa là nút cổ chai, hãy sử dụng nén mạnh hơn, nếu CPU là nút cổ chai, hãy sử dụng nén nhanh hơn. Nếu cả hai đều là nút cổ chai, hãy suy nghĩ lại toàn bộ thiết kế của bạn và bắt đầu lại, hoặc có được phần cứng tốt hơn.
Vịt Mooing

1
@FactorMystic OMG anh đã làm gì? Vô hiệu hóa tập tin trang sẽ làm giảm đáng kể RAM có thể sử dụng của bạn.
Aron

Câu trả lời:


45

Windows không giết các tiến trình khi tất cả RAM được sử dụng. Điều thực sự xảy ra là các quá trình không phân bổ bộ nhớ và sự cố.

Điều này xảy ra vì tất cả bộ nhớ vật lý của bạn đang được sử dụng và do pagefile bị vô hiệu hóa, trình quản lý bộ nhớ không còn khả năng viết các trang không được sử dụng. Điều này giữ cho RAM vật lý của bạn đầy và khi quá trình của bạn, hoặc bất cứ điều gì khác đang chạy vào thời điểm đó, cố gắng phân bổ một trang, nó sẽ thất bại. Một số ứng dụng bị sập.

Bài trình bày này từ Technet giải thích: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Pagefile đang giữ cho các ứng dụng không bị sập khi bạn sử dụng tất cả bộ nhớ của mình bằng cách đóng vai trò là điểm dừng cho sự cam kết quá mức.

Bộ nhớ ảo gần như là nền tảng của cách các hệ điều hành hiện đại phân bổ tài nguyên, vì vậy tất cả chỉ là có những thứ trong RAM đang sử dụng và di chuyển mọi thứ vào và ra khỏi đĩa.

Thực sự chỉ có hai câu trả lời:

  1. Kích hoạt lại tệp trang và tăng RAM trên máy tính của bạn để giảm việc đập đĩa.
  2. Giảm yêu cầu bộ nhớ của ứng dụng của bạn.

Điểm mấu chốt là RAM chỉ là một mức bộ nhớ cache khác và tất cả những thứ liên quan đến bộ nhớ ảo, tệp trang, tệp ánh xạ bộ nhớ và tất cả những thứ cơ bản đều thuộc về điều này: nếu bạn hết bộ nhớ, bạn cần thêm hơn.


4
Hoặc sử dụng ít hơn ....
nhgrif 18/12/14

1
Xin lưu ý rằng tồn đọng đang xây dựng vì dữ liệu không thể được ghi vào đĩa đủ nhanh. Tôi không nghĩ rằng việc kích hoạt bộ nhớ ảo trên cùng một đĩa có thể giúp ích ở đó ...
Alexander

3
Trong thực tế, tập tin trang sẽ ở một nơi khác trên đĩa. Và vì chúng ta biết đó không phải là SSD, điều đó có nghĩa là tìm kiếm vật lý là hoạt động đĩa chậm nhất.
MSalters

9
Âm thanh như bạn cần quản lý bộ nhớ rõ ràng trong ứng dụng của bạn sau đó ...
Joe

1
@Joe chính xác điều này. Trình thu gom rác sẽ biến việc quản lý bộ nhớ thành cơn ác mộng trong các tình huống này. Loại tình huống này là không đáng kể đối với tôi trong C ++ vì tôi có quyền kiểm soát tốt đối với tất cả việc sử dụng bộ nhớ. Mặc dù có những mẫu thiết kế cũng sẽ hoạt động tốt trong trường hợp này trong C #, nhưng nó không đơn giản như những gì hầu hết mọi người sẽ cố gắng.
Thebluefish

0

Truy cập Bảng điều khiển & Cài đặt nâng cao của Windows và vô hiệu hóa những thứ không cần thiết, như hiệu ứng cửa sổ nếu bạn chưa có, và nhận Sysiternals Process Explorer & / hoặc System Monitor để tìm và tắt bất cứ thứ gì gây lãng phí CPU hoặc bộ nhớ.

Quan trọng hơn, hãy sử dụng Process Explorer & / hoặc System Monitor để xem khi chương trình của bạn đang thực thi và xem chính xác vị trí và cách thức nó bị lỗi. Chủ đề nào bị thiếu bộ nhớ và chết trước - phần prgm chính hoặc phần ffmpeg? Có một dll cụ thể hoặc tài nguyên được chia sẻ khác mà bóng bay có kích thước bất ngờ? Hoặc là việc thực hiện tiến hành chính xác, ngoại trừ cắn nhiều hơn nó có thể nhai dữ liệu?

Tìm hiểu chính xác hơn bản chất của vấn đề của bạn có thể sẽ chỉ cho bạn hướng đi của một giải pháp. Chẳng hạn, bạn có thể triển khai chính sách giảm khung hình mạnh mẽ hơn, đồng thời tối ưu hóa tốt hơn cho tiêu chí chunk 8-10 giây của bạn để đạt được tổng chi phí RAM thấp hơn

Gợi ý cuối cùng: Có thể xem xét chuyển sang Linux và trong khi chờ đợi, hãy bật lại tệp hoán trang (linux gọi nó là không gian hoán đổi, làm cho IMHO nghe vui hơn, như gặp gỡ trao đổi hoặc một cái gì đó!) Chúc may mắn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.