2016-04-30 341 views
2

編譯的RMarkdown腳本隔夜未能與消息:R代碼裏面失敗:「錯誤:無法分配緩衝區」

Error: cannot allocate buffer
Execution halted

的代碼塊,它在死了,而訓練的10機器學習算法caretEnsemble列表。我知道它需要一定的內存和計算時間,但我之前成功地在控制檯中運行相同的代碼。爲什麼它在RMarkdown中失敗?我相當肯定,即使它沒有空閒的RAM,也有足夠的交換空間。

我使用3GB RAM和4GB交換運行Ubuntu。

,我發現關於R中的內存限制了博客文章,但它僅適用於Windows:http://www.r-bloggers.com/memory-limit-management-in-r/

解決/避免這個問題的任何想法?

+2

您可能會嘗試獲取該代碼部分(即將其粘貼到另一個Rscript中)。不知道它會工作,但值得一試。如果這不起作用,您可以隨時單獨運行,使用'save'保存結果,然後加載它們進行寫入。 – lmo

+0

謝謝,我最終使用'saveRDS'。不是最優雅的,因爲它不檢查緩存數據是否需要刷新,但它現在可行。在將來,我需要弄清楚如何更好地使用緩存/記憶。 – adatum

回答

2

爲什麼它可能會備份的一個原因是knitr和Rmarkdown只是給事情增加了一層計算複雜度並且需要一些內存。控制檯是最簡化的實現。

此外,卡特也很胖,很慢並且毫不抱歉。如果機器學習算法很複雜,那麼數據集很大,並且RAM的數量有限,這可能會造成問題。

有些事情可以做,以減輕負擔:

  1. 如果在該組未使用的變量,使用你想要的一個子集,然後使用rm()內存清除舊的設置您的括號中數據框的變量名稱。

  2. 刪除變量後,運行垃圾收集,它將回收內存空間,您刪除的變量和臨時集正在內存中佔用。

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的大多數算法流程。

    0

    當我在64位機器上無意中運行32位版本的R時,出現此錯誤。

    相關問題