2011-12-23 56 views
8

我正在計劃一個應用程序,它涉及到一次加載很多圖片,因此需要大量的內存。例如,我可能一次創建50個圖像對象,總共需要1GB的RAM。但是當用戶去加載20張圖片時,我想確保已經預留並準備好了大量的內存。如何爲我的應用程序保留內存並保留指定的數量?

現在這部分可能看起來有點偏離正常。而不是指定我的應用程序應該保留多少內存,而是需要指定爲其他應用程序釋放多少內存,並根據此規範週期性地調整應用程序的內存。我必須說,我從來沒有在預留內存方面工作過,尤其是不知道如何離開剩餘的可用內存。例如,如果計算機有2048 MB的RAM,並且該選項設置爲其他應用程序可以使用50 MB,並且其他應用程序已經使用了10 MB的RAM,則應該保留2048- 50-10 = 1988 MB爲我的應用程序。

我預見的麻煩是假設用戶打開另一個需要1GB的應用程序。我的應用程序必須抓住這個並縮小自己。

這是否聽起來像一個可行的方法?基本上,我需要確保在任何給定時間儘可能多地保留內存,同時爲其他應用留下可觀的數量。如果我這樣做,會不會對性能產生重大影響?我可能會以快速的步伐加載和卸載圖像,而且我不希望它按需保留/釋放該內存,我希望它保持保留。

+5

+1這是一個很好的問題,我完全不知道它爲什麼會降低效果。 – 2011-12-23 22:47:39

+1

@David。我正要問同樣的問題。 Downvoters:請提供一個理由,否則我們會認爲這只是一些試圖重寫莎士比亞的猴子的作品... – 2011-12-23 23:22:12

+3

This [article](http://msdn.microsoft.com/en-us/library/aa175282%28v= sql.80%29.aspx)是舊的,但它解釋了SQL Server 2000如何執行它。您可能會感興趣..請注意,我知道的所有應用程序都以這種方式進行操作,因此具有用於調整內存使用情況的其他選項。 – 2011-12-24 02:24:31

回答

8

+1對於Sertac提到的SQL Server如何乘坐它需要的內存分配線,但在Windows抱怨時釋放內存。

應用程序可以通過使用CreateMemoryResourceNotification接收窗口的投訴:

hLowMemory := CreateMemoryResourceNotification(LowMemoryResourceNotification); 

應用程序可以使用的內存資源通知事件來縮放 內存使用恰當的。如果可用內存不足,則應用程序可以減少其工作集。如果可用內存很高,則應用程序可以分配更多的內存。

調用 過程的任何線程都可以在呼叫 指定內存資源通知句柄QueryMemoryResourceNotification功能或wait functions之一。 當指定的 存儲條件存在時,該對象的狀態會發出信號。這是一個系統範圍的事件,因此所有 應用程序都會在發送對象時收到通知。注意 存在的存儲器可用性的範圍,其中無論是 LowMemoryResourceNotificationHighMemoryResourceNotification對象 被髮信號。在這種情況下,應用程序應該嘗試保持內存使用不變。

但也值得一提的是,你不妨分配你需要的內存。當內存壓力很高時,您的操作系統有一套非常複雜的算法來替換使用最少的內存。您可以通過簡單地分配所需的所有內存來利用此優勢。當Windows開始運行時,它會找到你使用最少的那些內存頁面,並將它們交換到磁盤。 (This is how a well-known reverse proxy works)。

剩下的唯一剩下的事情就是決定Windows是否說要在RAM上運行時釋放一些圖像。但是如果你沒有使用內存,它會被換出到你的磁盤。

+0

+1並且接受:D我打算通過暫停特定圖形的某些呈現或降低呈現方式來解決Windows投訴。我將多層圖像合併爲一個主圖像(有點像操作系統)。基本上我有一個「桌面」模擬自定義繪製的窗口等等,以及繪製處理等。就像Windows通過'Invalidate'處理繪畫命令一樣; – 2011-12-24 05:19:19

+0

感謝聖誕禮物Ian,Sertac和David:P – 2011-12-24 05:23:04

+0

其他人試着看看它是否真的有效?當我嘗試使用QueryMemoryResourceNotification並且我從來沒有收到通知 - 即使由於等待分配內存而導致進程掛起時。 – 2015-04-10 21:41:37

7

考慮其他應用程序是不現實的。只要忽略它們。系統會根據需要將內容分頁和分頁。如果你真的想這樣做,你就必須在開始和結束時動態適應其他進程。這真的不現實。而且,詢問其他進程需要多少內存是不實際的。把它全部留給系統。

爲您的應用設置預算,並確保不超過它。將最近使用的圖像保存在內存中,當你接近你的內存預算時,扔掉最近最少使用的圖像來騰出空間。

如果您正在強調可用資源,請確保您使用FastMM併爲您的應用啓用LARGE_ADDRESS_AWARE,以便在64位操作系統上運行時獲得4GB地址空間。

+0

+1謝謝,這很有道理。我很遺憾地說我還*還沒有嘗試過FastMM,但很快就打算。我明白這對Delphi 7來說實際上是必不可少的。 – 2011-12-23 23:16:59

+0

是的。這是OS的業務。你所能做的就是避免對記憶的貪婪/粗心大意。 – 2011-12-23 23:24:27

+4

您不僅需要LARGE_ADDRESS_AWARE它,它甚至可以找到懸掛指針訪問! ;-) – 2011-12-23 23:24:53

相關問題