簡體   English   中英

R 錯誤:java.lang.OutOfMemoryError:Java 堆空間

[英]R Error: java.lang.OutOfMemoryError: Java heap space

我正在嘗試將 R 連接到 Teradata,以將數據直接提取到 R 中進行分析。 但是,我得到的錯誤是,

Error in .jcall(rp, "I", "fetch", stride, block) :
  java.lang.OutOfMemoryError: Java heap space

我試圖通過以下方式設置我的 R 選項以增加 JVM 的最大堆大小:

options(java.parameters = "-Xmx8g")

我還嘗試使用 rJava 函數.jinit將 java 參數初始化為: .jinit(parameters="-Xmx8g") 但還是失敗了。

計算出來的數據大小應該是3G左右(實際小於3G)。

您需要確保在加載 rJava 或任何其他包之前分配額外的內存。 首先擦除環境(通過rm(list = ls()) ),如果必須重新啟動 R/Rstudio,然后修改腳本開頭的選項。

options(java.parameters = "-Xmx8000m")

參見例如https://support.snowflake.net/s/article/solution-using-r-the-following-error-is-returned-javalangoutofmemoryerror-gc-overhead-limit-exceeded

我以某種不可重現的方式遇到了這個問題,使用-Xmx8g部分解決了它,但隨機遇到了問題。

我現在通過使用找到了一個帶有不同垃圾收集器的選項

options(java.parameters = c("-XX:+UseConcMarkSweepGC", "-Xmx8192m"))
library(xlsx)

在腳本的開頭和加載任何其他包之前,因為其他包可以自己加載一些 java 東西,並且必須在加載任何 Java 之前設置選項。

至此,問題沒有再發生。

只是有時在長時間的會話中它仍然會發生。 但在這種情況下,會話重啟通常可以解決問題。

在 Mac 上運行以下兩行代碼(在加載任何包之前)對我有用:

options(java.parameters = c("-XX:+UseConcMarkSweepGC", "-Xmx8192m"))
gc()

這實質上結合了之前在此發布的兩個建議:重要的是,僅單獨運行第一行(如 drmariod 所建議的那樣)並沒有解決我的問題。 但是,當我在第一行之后額外執行gc()時(如 user2961057 所建議的),問題就解決了。

如果它仍然不起作用,請重新啟動 R 會話,然后嘗試(在加載任何包之前)而不是options(java.parameters = "-Xmx8g") ,然后直接執行gc() 或者,嘗試將 RAM 從"-Xmx8g"進一步增加到例如"-Xmx16g" (前提是您至少有同樣多的 RAM)。

編輯:進一步的解決方案:雖然我不得不在 R 中使用 rJava 進行模型估計(從大量的X中解釋y ),但即使我擴大到"-Xmx60000m" (機器我使用的是 64 GB 內存)。 問題是某些模型規格實在太大(並且需要更多 RAM)。 在這種情況下可能有幫助的一種解決方案是縮小問題的規模(例如,通過減少模型中 X 的數量),或者——如果可能的話——將問題分成獨立的部分,分別估計每個部分,然后將這些部分放在一起再次。

我添加了垃圾收集,這為我解決了這個問題。 我正在使用 RJDBC 連接到 Oracle 數據庫。
只需添加 gc()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM