2014-08-27 128 views
3

我在R中有一個主函數,它調用其他文件來運行我的程序。我通過一個bat文件(.exe)調用主文件。當我一行一行地運行它時,它沒有出現內存錯誤,但是當我調用bat文件運行它時,它停止並給我出現以下錯誤:R:無法分配大於x的內存MB

無法分配大於51 MB的內存。

我該如何避免這種情況?

+0

聽起來你正在使用64位的R'當你運行它通過線與32位R線在批處理文件。 – 2014-08-27 16:34:06

回答

1

是的,你應該使用64位R,如果可以的話。

請參閱this question,這來自R docs

2

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配置文件不同。

如果架構不是你的內存錯誤的原因,那麼你有幾個解決步驟:在兩種環境

  1. 查看內存使用(R中直接通過您的蝙蝠過程)在使用本: sort(sapply(ls(),function(x){object.size(get(x))}))
  2. 在腳本中顯式運行的垃圾收集器,這就是gc()命令
  3. 檢查所有對象的大小以確保沒有在你的蝙蝠過程中沒有意外的結果:sort(sapply(ls(),function(x){format(object.size(get(x)), units = "Mb")}))
  4. 嘗試內存分析:

    Rprof(tf <- "rprof.log", memory.profiling=TRUE) 
    Rprof(NULL) 
    summaryRprof(tf) 
    
  5. 雖然這是一個RAM問題,好措施,你可能要檢查可用的計算能力是既充足,運行這兩種方式之間有變化的代碼:parallel::detectCores()

  6. 檢查你的表現與教授。哈德利Wikham的lineprof工具(警告:需要devtools和行代碼調用其中的C語言編程不工作)

    參考雖然我拉這些片段出我自己的代碼,其中大部分最初來從其他相關的StackOverflow職位,如:

    1. Reaching memory allocation in R
    2. R Memory Allocation "Error: cannot allocate vector of size 75.1 Mb"
    3. R memory limit warning vs "unable to allocate..."
    4. How to compute the size of the allocated memory for a general type
    5. R : Any other solution to "cannot allocate vector size n mb" in R?