我在R中有一個主函數,它調用其他文件來運行我的程序。我通過一個bat文件(.exe)調用主文件。當我一行一行地運行它時,它沒有出現內存錯誤,但是當我調用bat文件運行它時,它停止並給我出現以下錯誤:R:無法分配大於x的內存MB
無法分配大於51 MB的內存。
我該如何避免這種情況?
我在R中有一個主函數,它調用其他文件來運行我的程序。我通過一個bat文件(.exe)調用主文件。當我一行一行地運行它時,它沒有出現內存錯誤,但是當我調用bat文件運行它時,它停止並給我出現以下錯誤:R:無法分配大於x的內存MB
無法分配大於51 MB的內存。
我該如何避免這種情況?
是的,你應該使用64位R,如果可以的話。
請參閱this question,這來自R docs。
R這樣的內存限制對我們來說是一個反覆出現的噩夢。
很多時候,問題是由你的操作系統的限制(通常可一擊或PowerShell命令行上改變),建築(32訴64位),或連續自由可用性強加的限制RAM,無論整體可用內存如何。
很難說爲什麼某些東西在逐行運行時不會引起內存問題,但在作爲.bat運行時會遇到內存限制。
您運行的是哪個版本的R?你有兩個安裝?當您運行.bat文件時,32位被Rscript
調用,而您逐行運行64位版本?您可以使用R.Version()
來檢查正在運行的R的版本。
您可以在R IDE /終端和.bat文件(確保爲print
或將結果保存爲.bat文件中的對象)中運行命令memory.limit()
來測試。您可能也會嘗試設置memory.limit()
在您的.bat文件中,因爲它可能只是有一個較小的默認值,可能是由於您的IDE或終端與.bat文件調用的R配置文件不同。
如果架構不是你的內存錯誤的原因,那麼你有幾個解決步驟:在兩種環境
sort(sapply(ls(),function(x){object.size(get(x))}))
gc()
命令sort(sapply(ls(),function(x){format(object.size(get(x)), units = "Mb")}))
嘗試內存分析:
Rprof(tf <- "rprof.log", memory.profiling=TRUE)
Rprof(NULL)
summaryRprof(tf)
雖然這是一個RAM問題,好措施,你可能要檢查可用的計算能力是既充足,運行這兩種方式之間有變化的代碼:parallel::detectCores()
檢查你的表現與教授。哈德利Wikham的lineprof
工具(警告:需要devtools
和行代碼調用其中的C語言編程不工作)
參考雖然我拉這些片段出我自己的代碼,其中大部分最初來從其他相關的StackOverflow職位,如:
聽起來你正在使用64位的R'當你運行它通過線與32位R線在批處理文件。 – 2014-08-27 16:34:06