
我使用的是 Windows 7 x64,配備 4 核心 Intel i7 和 8 GB RAM,但最近感覺我的電腦的「RAM」僅位於硬碟上。
這是任務管理器顯示的內容:
清單中的進程所使用的記憶體總量約為 1 GB。這幾天我的電腦上發生的情況是,一個程式 (Cataloger.exe) 不斷處理大量檔案(每個檔案接近 5-10 MB),反覆開啟和讀取它們以進行編目。但它在記憶體中並沒有增長太多,並且保持在 100 MB 左右的大小。然而,它在 30 分鐘內處理的資料量可以以千兆位元組為單位。
所以我的猜測是 Windows 檔案快取與此有關。經過對該主題的一些研究,我發現了這個名為 RamMap 的程序,它可以顯示電腦 RAM 的詳細資訊。這是螢幕截圖:
所以對我來說,Windows 在 RAM 中保留了大量不再需要的數據,將任何 RAM 分配請求重定向到硬碟上的頁面檔案。即使當我關閉 Cataloger.exe 時,RamMap 報告的映射檔案的大小在很長一段時間內都大致相同。這不僅僅是這個特定的程序。早些時候,我注意到在使用其他程式進行一些大量文件操作後也出現了類似的速度下降。因此,這確實不是 Cataloger.exe 的異常行為,而且該問題在過去多次出現過。
不管是什麼,它都會使計算機速度降低約 50 倍。在 Chrome 中開啟新分頁需要 20-30 秒,開啟新程式可能需要長達一分鐘。由於速度減慢,某些程式甚至崩潰。
那麼您認為問題是隱藏在檔案快取中還是其他地方?我該如何解決?
答案1
這一切一切如常,一切正常。 Windows 不會將快取檔案保存在記憶體中而不是其他資料上 - 快取檔案意味著在某個時刻,Windows有將它們加載到內存中或從磁碟中讀取它們,從那時起就沒有出現更高優先級的東西。一旦您恢復使用電腦並且程式請求內存,Windows 就會很樂意刪除快取的檔案以騰出空間。
如果您查看RAMMap,您會注意到大多數快取檔案都是在「備用」下分配的- 這意味著它被保存在記憶體中,因為Windows 過去需要它,可能會再次需要它,並且會很樂意丟棄它如果還有別的事實際上需要空間。
基本上,您在這裡看到的是您的程式請求加載一個大數據文件,因此 Windows 將其加載到記憶體中。管理記憶體是一個非常複雜的過程,Windows 在幕後所做的就是做出判斷:它查看當前進程,並發現 Chrome 正在佔用,比如說 5GB 內存(很多選項卡!),但是在過去的一個小時內,大部分記憶都沒有被觸及。此時,它有一個選擇:可以將 Chrome 保留在記憶體中,而不是快取檔案。這意味著編目器進程可能需要幾個小時而不是幾分鐘來處理文件,特別是當它在文件中頻繁跳轉時;或者,它可以調出 chrome 標籤並將 Cataloger 檔案載入到記憶體中,並快速完成該過程。
現在,當 Windows 必須將 chrome 分頁回內存時,您會感到痛苦,但 Windows 不會這樣做,除非您請求它(即,將 chrome 返回到前台並選擇一個已分頁的選項卡),以及什麼最終需要由您評估的是,這種痛苦是否大於或小於您的編目器任務必須等待其記憶體的痛苦。您可以嘗試將程式作為服務運行,並告訴 Windows 優化響應能力,或者嘗試降低進程優先級,但我很確定您想要的是編目器進程盡快完成 - 雖然它會耗盡您的磁碟I/O,你的整個系統將會變得異常緩慢。所有需要磁碟 I/O 的內容都會被放入佇列中(甚至是網頁瀏覽 - 它也有一個使用的快取!)。程式開啟速度很慢,新分頁開啟速度很快,但實際使用它們來執行某些操作會很慢。
如果程式只是按順序讀取一個又一個文件,然後不再接觸它們,我同意 Windows 不需要快取這些文件。這裡的問題是 Windows 不知道這一點,因為沒有人告訴它它們不需要快取。
如果您有權存取 Cataloger 程式的原始程式碼(或可以要求對其進行修改),則可以將其配置為使用 來開啟文件FILE_FLAG_NO_BUFFERING
,這將導致 Windows 跳過該程式以這種方式開啟的文件的磁碟快取。
如果這不是一個選項,那麼除非編目器進程有要在您的系統上運行,我會四處查看是否有一台未使用的備用計算機,並查看是否可以將其設置為專用計算機來對這些文件進行編目。如果還沒有,簡單地增加 RAM 可能是另一種選擇;如今內存價格相當便宜,開發人員知道這一點 - 大多數東西都是以犧牲內存為代價來優化速度和響應能力的。 8GB已經不是以前的那個了。
另一種選擇是將其使用的所有檔案移至單獨的硬碟上,並專門關閉該磁碟機的磁碟快取。
答案2
我遇到了同樣的問題,它是一個名為“intellimem.exe”的進程,我刪除了它並且 KABOM!從 80% 的 ram 和頁面文件到無頁面文件和 20% 的 ram 使用!我沒有任何問題。