用 Ramdisk 減少硬碟寫入, 再配合 junction 強化

很多人都知道可以在電腦建立 Ramdisk , 把不太重要但讀寫頻繁的檔案改存到 Ramdisk ; 不過有些軟體並不能更動目錄, 就可以再使用 junction 來強化; 以下就是以 Java 來當範例.

很多人都知道可以在 Windows 環境建立 Ramdisk , 再把 Windows 的 TEMP , IE 的 Temporary Internet Files 搬到 Ramdisk , 由於 Ram 存取及搜尋速度遠超過硬碟, 可以減少軟體讀寫檔案的延遲, 又可以降低硬碟讀寫次數.

可是有些軟體本身有固定的檔案寫入位址, 例如大部份的人電腦都有安裝 Java , 而 Java 會把檔案暫存在 使用者的 Application Data\Sun\Java\Deployment\cache 與 SystemCache 目錄下, 或是 IE 的歷史記錄是在 Local Settings\History 等等, 如果想把這些目錄, 改到 Ramdisk , 雖然很多網站有教怎麼改 Registry 把目錄移到 Ramdisk , 可是如果升級或重新安裝, 有時擔心程式出問題, 好像又有點不順手.

其實 NTFS 已經有支援 junction 功能, 也就是在 Linux 的 ext FS 已經普遍使用的 Soft Link , 在 Windows 的磁碟管理畫面, 其實就有"把磁碟加在空的 NTFS 目錄", 也就是 junction 的應用, 只是 XP/2003 以前沒有一個專用的程式.

所以在應用上, 只要發現程式有大量讀寫硬碟, 再確認這些頻繁讀寫的資料並沒有很重要, 就可以透過 junction 這小程式, 把暫存的目錄, 改成在 Ramdisk 建立的目錄, 這樣不必異動程式設定, 又可以提高速度.

例如剛剛舉 Java 為例, 第一次搬移時:
  1. rem 第一次先把檔案 copy 到 Ramdisk  
  2. for %%f in ("Documents and Settings\使用者\Application Data\Sun\Java\Deployment\cache"do xcopy /c /d /e /h /y "C:\%%~f" "R:\%%~f\"  
  3. rem 把目錄改名, 如果遇到問題可以救, 沒問題再刪.  
  4. for %%f in ("Documents and Settings\使用者\Application Data\Sun\Java\Deployment\cache"do move "C:\%%~f" "C:\%%~f_old"  
  5. rem 實際建立連結, 注意用法是"新連結"在前, 對應的目錄在後.  
  6. for %%f in ("Documents and Settings\使用者\Application Data\Sun\Java\Deployment\cache"do junction /s "C:\%%~f" "R:\%%~f"  

以後開機時, 或由 Ramdisk 建立後再接著執行
  1. for %%f in ("Documents and Settings\使用者\Application Data\Sun\Java\Deployment\cache"do md "R:\%%~f"  

由於 C: 底下的連結已經建好了, 所以之後不必再連結, 只要確保對應的目錄存在, 以後跑 Java 時就會把暫存檔放在 Ramdisk 了.

而相同的應用, 也可以用在如 P2P 軟體的索引, 如 aMule 是放在 C:\Documents and Settings\使用者\Application Data\aMule , 只是要記得關機前找地分備份.

當然還有其他方式, 例如單一 folder cache 軟體等, 只是個人偏好系統內不要裝太多軟體, 所以有 junction 這樣簡便的軟體, 就先測這套, 也想應用如: 以後裝完系統, 整個 Documents and Settings 就搬到另一個磁碟, 在系統碟是建立 junction , 備份就相對輕鬆了.

junction 檔案下載: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx