2011-12-23 23 views
8

Tôi đang lập kế hoạch một ứng dụng sẽ liên quan đến việc tải nhiều ảnh cùng một lúc và do đó yêu cầu một bộ nhớ lớn. Ví dụ, tôi có thể có 50 đối tượng hình ảnh được tạo cùng một lúc, lấy tổng cộng 1GB RAM. Nhưng khi người dùng đi để tải thêm 20 hình ảnh, tôi muốn đảm bảo rằng số lượng bộ nhớ đã được dành riêng và sẵn sàng.Làm thế nào để đặt trước bộ nhớ cho ứng dụng của tôi và để lại một số tiền nhất định còn lại?

Phần này có vẻ hơi lạc hậu so với bình thường. Thay vì chỉ định dung lượng bộ nhớ mà ứng dụng của tôi sẽ đặt trước, thay vào đó tôi cần chỉ định dung lượng bộ nhớ còn trống cho các ứng dụng khác và điều chỉnh bộ nhớ của ứng dụng định kỳ theo đặc điểm kỹ thuật này. Tôi phải nói rằng tôi chưa bao giờ làm việc với việc đặt trước bộ nhớ, và đặc biệt là sẽ không biết cách để lại bộ nhớ còn lại. Ví dụ: nếu máy tính có RAM 2048 MB và tùy chọn được đặt để đặt 50 MB miễn phí cho các ứng dụng khác và đã có 10MB bộ nhớ RAM đang được các ứng dụng khác sử dụng, thì nên đặt trước 2048- 50-10 = 1988 MB cho ứng dụng của tôi.

Sự cố mà tôi thấy trước là giả sử người dùng mở ứng dụng khác yêu cầu 1GB. Ứng dụng của tôi phải bắt được và thu nhỏ bản thân.

Điều này nghe có vẻ giống như một cách tiếp cận khả thi không? Về cơ bản, tôi cần đảm bảo có nhiều bộ nhớ nhất định có thể tại bất kỳ thời điểm nào, trong khi vẫn để lại một số lượng phong nha có sẵn cho các ứng dụng khác. Nó có ảnh hưởng đáng kể đến hiệu suất nếu tôi làm điều này hay không nhiều? Tôi có thể đang tải và dỡ hình ảnh ở các bước nhanh, và tôi không muốn nó dự trữ/giải phóng bộ nhớ này theo yêu cầu, tôi muốn nó được giữ lại.

+5

+1 Đây là một câu hỏi hay và tôi hoàn toàn không biết tại sao nó có downvotes. –

+1

@David. Tôi sắp hỏi cùng một câu hỏi. Downvoters: xin vui lòng cung cấp một lý do hoặc chúng tôi sẽ nghĩ rằng nó chỉ là công việc của một số con khỉ cố gắng để viết lại Shakespeare ... –

+3

[Điều này] (http://msdn.microsoft.com/en-us/library/aa175282%28v= sql.80% 29.aspx) là cũ, nhưng nó giải thích làm thế nào SQL Server 2000 hiện nó. Bạn có thể quan tâm .. Chỉ cần lưu ý, tất cả các ứng dụng mà tôi biết về hành động đó theo cách này, có các tùy chọn bổ sung để điều chỉnh mức sử dụng bộ nhớ. –

Trả lời

8

1 cho nhắc đến như thế nào SQL Server cưỡi dòng phân bổ bộ nhớ cần thiết, nhưng giải phóng bộ nhớ khi Windows phàn nàn Sertac của.

Ứng dụng có thể nhận được khiếu nại của Window bằng CreateMemoryResourceNotification:

hLowMemory := CreateMemoryResourceNotification(LowMemoryResourceNotification); 

Ứng dụng có thể sử dụng các sự kiện thông báo tài nguyên bộ nhớ để mở rộng việc sử dụng bộ nhớ cho phù hợp. Nếu bộ nhớ khả dụng thấp, ứng dụng có thể giảm bộ làm việc của nó. Nếu bộ nhớ có sẵn là cao, ứng dụng có thể cấp phát bộ nhớ hơn.

Bất kỳ chủ đề của gọi quá trình có thể xác định thông báo xử lý tài nguyên bộ nhớ trong một cuộc gọi đến QueryMemoryResourceNotification chức năng hoặc một trong các wait functions. Tình trạng của đối tượng được báo hiệu khi quy định tình trạng bộ nhớ tồn tại.Đây là sự kiện toàn hệ thống, vì vậy tất cả các ứng dụng đều nhận được thông báo khi đối tượng được báo hiệu. Lưu ý rằng có một loạt các tính sẵn sàng ký ức, nơi không LowMemoryResourceNotification hoặc HighMemoryResourceNotification đối tượng được báo hiệu. Trong trường hợp này, các ứng dụng nên cố gắng giữ hằng số sử dụng bộ nhớ .

Nhưng điều đáng nói là bạn cũng có thể phân bổ bộ nhớ mà bạn cần. Hệ điều hành của bạn có một bộ thuật toán rất kỳ quặc để hoán đổi bộ nhớ ít được sử dụng nhất khi áp suất bộ nhớ cao. Bạn có thể tận dụng điều này bằng cách phân bổ tất cả bộ nhớ mà bạn cần. Khi Windows bắt đầu chạy thấp, nó sẽ tìm thấy những trang của bộ nhớ mà bạn đang sử dụng ít nhất và trao đổi chúng ra đĩa. (This is how a well-known reverse proxy works).

Điều duy nhất còn lại là quyết định xem bạn có muốn giải phóng một số hình ảnh khi Windows cho biết nó sắp hết RAM. Nhưng nếu bạn không sử dụng bộ nhớ, nó sẽ được trao đổi ra đĩa cho bạn.

+0

+1 và được chấp nhận: D Tôi định xử lý các khiếu nại của Windows bằng cách tạm dừng hiển thị một số đồ họa nhất định hoặc bằng cách giảm độ phân giải. Tôi có các lớp trên các lớp hình ảnh để kết hợp thành một hình ảnh chính (được đặt ra một chút giống như một hệ điều hành). Về cơ bản tôi có một mô phỏng "Desktop" với các cửa sổ được vẽ tùy chỉnh, vv và xử lý sơn, vv Giống như cách Windows xử lý các lệnh vẽ thông qua 'Invalidate;' –

+0

Và cảm ơn món quà Giáng sinh Ian, Sertac và David: P –

+0

đã thử điều này để xem nó có thực sự hoạt động không? Khi tôi thử sử dụng QueryMemoryResourceNotification và tôi không bao giờ nhận được thông báo - ngay cả khi các quá trình đang treo do phải đợi để cấp phát bộ nhớ. –

7

Không thực tế khi tính đến các ứng dụng khác. Chỉ cần bỏ qua chúng. Hệ thống sẽ trang những thứ trong và ngoài khi cần thiết. Nếu bạn thực sự muốn làm điều này, bạn sẽ phải tự động thích nghi với các quá trình khác khi chúng bắt đầu và kết thúc. Điều đó thực sự không thực tế. Hơn nữa, không cần thiết phải tìm hiểu các quy trình khác bao nhiêu bộ nhớ mà họ cần. Để lại tất cả cho hệ thống.

Đặt ngân sách cho ứng dụng của bạn và đảm bảo bạn không vượt quá nó. Giữ những hình ảnh gần đây nhất được sử dụng trong bộ nhớ và khi bạn tiếp cận ngân sách bộ nhớ của bạn vứt bỏ những hình ảnh gần đây nhất được sử dụng để làm cho không gian.

Nếu bạn đang nhấn mạnh các tài nguyên sẵn có thì hãy đảm bảo bạn sử dụng FastMM và bật LARGE_ADDRESS_AWARE cho ứng dụng của bạn để bạn nhận được không gian địa chỉ 4GB khi chạy trên hệ điều hành 64 bit.

+0

+1 Cảm ơn, điều đó có ý nghĩa. Tôi rất tiếc phải nói rằng tôi vẫn * chưa thử FastMM, nhưng dự định sẽ sớm thôi. Tôi hiểu nó thực sự là một điều cần thiết cho Delphi 7. –

+0

Đúng vậy. Đó là kinh doanh của OS ở đây. Tất cả những gì bạn có thể làm là tránh tham lam/bất cẩn với trí nhớ. –

+4

Không chỉ bạn cần nó cho LARGE_ADDRESS_AWARE, nó thậm chí có thể tìm thấy con trỏ lơ lửng truy cập! ;-) –

Các vấn đề liên quan