爲什麼它可能會備份的一個原因是knitr和Rmarkdown只是給事情增加了一層計算複雜度並且需要一些內存。控制檯是最簡化的實現。
此外,卡特也很胖,很慢並且毫不抱歉。如果機器學習算法很複雜,那麼數據集很大,並且RAM的數量有限,這可能會造成問題。
有些事情可以做,以減輕負擔:
如果在該組未使用的變量,使用你想要的一個子集,然後使用rm()
內存清除舊的設置您的括號中數據框的變量名稱。
刪除變量後,運行垃圾收集,它將回收內存空間,您刪除的變量和臨時集正在內存中佔用。
R具有記憶清除沒有本地的方法,所以如果一個函數不與垃圾收集寫,你不這樣做,執行所有你過去的垃圾是堅持在內存使生活艱苦。
要做到這一點,只需在括號內輸入gc()
即可。在10次ML運行之間也用gc()
清除內存。如果你使用XLConnect導入數據,java實現是非常低效的......那麼在每次使用它之後,單獨就可以挖掘你的內存,gc()
。
建立培訓,測試和驗證集,保存在硬盤上以CSV格式的測試和驗證文件,並從你的記憶中刪除,並運行後,你猜對了gc().
在第一個模型之後需要時再次加載它們。
一旦你決定要運行這些算法,嘗試單獨安裝原包裝,而不是按名稱運行插入符號,每個require()
當你得到它和每一個與detach(package:packagenamehere)
gc()
後清理。
有兩個原因。
其中一個,卡雷特是其他ML算法的集合,它本身比它們在本地環境中的所有這些算法都要慢。舉個例子:我在30分鐘內通過Caret的隨機森林運行一個數據集,結果我還不到20%。它已經在大約一個小時的時間內墜毀了兩次。我加載了原始的獨立包,並在大約4分鐘內完成了分析。
兩個,如果你需要,分離和垃圾收集,你有更少的駐留內存擔心讓你失望。否則,你會同時在內存中使用所有的插入符號......這是浪費的。
有一些一般的事情,你可以做,使它更好,你可能最初不會想到,但可能會有用。根據您的代碼,他們可能會或可能不會在不同程度上工作或工作,但請嘗試一下,看看它們在哪裏。
I.使用詞法作用域對您有利。在乾淨的Rstudio環境中運行整個腳本,並確保所有零件和部件都位於工作空間中。然後垃圾收集殘餘物。然後去看看你的現有工作空間裏的零件和零件。它可以在同一個rStudio外殼下的Markdown中使用,只要在循環內沒有創建任何東西並且不將它保存到全局環境中。
二,在markdown中,將代碼設置爲塊,以便緩存需要多次計算的內容,以便它可以在某處準備好調用,而不是多次累計內存。
如果從數據框中調用一個變量,可以像對一列中的每個觀察值進行乘法操作一樣簡單,然後將其保存回原來的相同幀中,最終可以在內存中存儲多達3個副本。如果文件很大,那是一個殺手。因此,做一個乾淨的副本,垃圾收集和緩存純粹的框架。
緩存直覺好像它會浪費內存,做錯了會,但如果你從環境和GC RM()不必要的()有規律,你可能會從戰術緩存
III受益。如果事情仍然陷入困境,您可以嘗試將結果保存在csv文件中,然後將它們發送到硬盤驅動器,並根據需要將它們恢復以將它們移出內存(如果您一次不需要所有數據)。
我非常確定您可以根據需要將程序設置爲加載和卸載庫,數據和結果。但說實話,根據我自己的偏見經驗,你可以做的最好的事情就是脫離Caret的大多數算法流程。
您可能會嘗試獲取該代碼部分(即將其粘貼到另一個Rscript中)。不知道它會工作,但值得一試。如果這不起作用,您可以隨時單獨運行,使用'save'保存結果,然後加載它們進行寫入。 – lmo
謝謝,我最終使用'saveRDS'。不是最優雅的,因爲它不檢查緩存數據是否需要刷新,但它現在可行。在將來,我需要弄清楚如何更好地使用緩存/記憶。 – adatum