【问题标题】:caught segfault error in R在 R 中捕获了段错误
【发布时间】:2014-10-29 15:29:35
【问题描述】:

每次我尝试运行 ggplot2 包 (1.0.0) 中的任何绘图功能时都会收到 caught segfault 错误。我已经用qplotgeom_dotplotgeom_histogram 等进行了尝试。包中的数据(例如diamondseconomics)工作得很好。

我在 Mac OS 10.9.4(最新版本)和 R 3.1.1(也是最新版本)上运行。使用标准 R GUI、RStudio 以及从命令行使用 R 时,我遇到了同样的错误。该命令会调出默认图形设备(用于 R GUI 和命令行的 Quartz),但也会出现终端错误。

library(ggplot2)
qplot(1:10)

给我错误:

*** caught segfault ***
address 0x18, cause 'memory not mapped'

Traceback:
 1: .Call("plyr_split_indices", PACKAGE = "plyr", group, n)
 2: split_indices(scale_id, n)
 3: scale_apply(layer_data, x_vars, scale_train, SCALE_X, panel$x_scales)
 4: train_position(panel, data, scale_x(), scale_y())
 5: ggplot_build(x)
 6: print.ggplot(list(data = list(), layers = list(<environment>),     scales = <S4 object of class "Scales">, mapping = list(x = 1:3),     theme = list(), coordinates = list(limits = list(x = NULL,         y = NULL)), facet = list(shrink = TRUE), plot_env = <environment>,     labels = list(x = "1:3", y = "count")))
 7: print(list(data = list(), layers = list(<environment>), scales = <S4 object of class "Scales">,     mapping = list(x = 1:3), theme = list(), coordinates = list(        limits = list(x = NULL, y = NULL)), facet = list(shrink = TRUE),     plot_env = <environment>, labels = list(x = "1:3", y = "count")))

Possible actions:

 1: abort (with core dump, if enabled)
 2: normal R exit
 3: exit R without saving workspace
 4: exit R saving workspace

这是我的会话信息:

R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] graphics  grDevices utils     datasets  stats     methods   base     

other attached packages:
[1] ggplot2_1.0.0 marelac_2.1.3 seacarb_3.0   shape_1.4.1   beepr_1.1     birk_1.1     

loaded via a namespace (and not attached):
[1] audio_0.1-5      colorspace_1.2-4 digest_0.6.4     grid_3.1.1       gtable_0.1.2    
[6] MASS_7.3-34      munsell_0.4.2    plyr_1.8.1       proto_0.3-10     Rcpp_0.11.2     
[11] reshape2_1.4     scales_0.2.4     stringr_0.6.2    tools_3.1.1

我从其他人那里得知这是某种内存问题,但即使我有超过 2 GB 的可用 RAM,也会出现此错误。我知道这是一个广泛使用的包,所以当然这不会发生在每个人身上,但为什么会发生在我身上呢?有谁知道我可以做些什么来解决这个问题?

【问题讨论】:

  • 因此,如果您启动一个全新的 R 会话并仅运行这两个命令 (library(ggplot2); qplot(1:10)),您会收到该错误吗?您能否在运行library(ggplot2) 后将sessionInfo() 的输出也添加到您的问题中。
  • @MrFlick,是的,这是正确的。此错误发生在全新的 R 会话期间。 sessionInfo 输出已添加。
  • “marelac_2.1.3、seacarb_3.0、shape_1.4.1、beepr_1.1 birk_1.1”包的加载位置/时间?您是否在某处设置了.Rprofile?当您启动 R 时,它是否会恢复已保存的工作区(工作目录中是否有 .Rdata 文件)?
  • @MrFlick,所有这些包都是从.Rprofile 加载的,是的。但是,即使我删除了.Rprofile,也会出现同样的问题。 R 没有恢复已保存的工作区。
  • 所以这是一个开始。是否有可能您安装了为 SL 版本开发的 ggplot2 二进制文件?

标签: r


【解决方案1】:

这不是这个问题的答案,但它可能对某人有所帮助。 (灵感来自 user1310503。谢谢!)

我正在处理具有三个 cols 的 data.frame df:col1、col2、col3。 一开始,

df =data.frame(col1=character(),col2=numeric(),col3=numeric(),stringsAsFactors = F)

过程中多次使用rbind,如:

aList<-list(col1="aaa", col2 = "123", col3 = "234")
dfNew <- as.data.frame(aList)
df <- rbind(df, dfNew)

最后,df通过data.table::fwrite写入文件

data.table::fwrite(x = df, file = fileDF, append = FALSE, row.names = F, quote = F, showProgress = T)

df 有 5973 行和 3 列。 “捕获的段错误”总是发生:

address 0x1, cause 'memory not mapped'. 

这个问题的解决方法是:

aList<-list(col1=as.character("aaa"), col2 = as.numeric("123"), col3 = as.numeric("234"))
dfNew <- as.data.frame(aList)
dfNew$col1 <- as.characer(dfNew$col1)
dfNew$col2 <- as.numeric(dfNew$col2)
dfNew$col3 <- as.numeric(dfNew$col3)
df <- rbind(df, dfNew)

那么这个问题就解决了。可能的原因是cols的类不同。

【讨论】:

  • 这正是我想要的。我没有确保我的列在 rbind() 之前以相同的顺序出现。只需在 rbind() 之前重新排序 stackoverflow.com/a/7496246/5021307 中的列即可解决此问题。
【解决方案2】:

这不是这个问题的答案,但它可能对某人有用。当我使用pdf 创建PDF 图形设备然后使用plot 时,我遇到了段错误。这发生在 R 2.15.3、3.2.4 和一两个其他版本上,在 Scientific Linux 版本 6.7 上运行。我尝试了很多不同的东西,但我可以让它工作的唯一方法是(a)使用pngtiff而不是pdf,或者(b)保存大的.RData文件,然后使用完全独立的R 程序来创建图形。

【讨论】:

  • 我有同样的问题,这与我使用的解决方法相同。如果您能找到解决方法或原因,请告诉我。
  • 这很有趣。当内存中有一个非常大的对象时,我只会遇到段错误(plot 命令中没有使用此对象)。你也一样吗?所以我的另一个想法是将大对象保存到磁盘并将其从内存中删除,或者在执行pdf 之前或在pdfplot 之间,然后重新加载它。但我还没有尝试过,因为它需要一些重写。
  • 就我而言,我没有任何大对象。我明确地运行了一个“gc()”来强制垃圾回收,并在运行一个“plot(1:10)”命令之前检查了空闲内存。那时它有超过 20GB 的可用 RAM。
【解决方案3】:

如果其他人将来遇到此问题或类似问题,我向包维护者发送了错误报告,他建议卸载所有已安装的包并重新开始。我接受了他的建议,并且奏效了!

我听从了这篇帖子的建议:http://r.789695.n4.nabble.com/Reset-R-s-library-to-base-packages-only-remove-all-installed-contributed-packages-td3596151.html

ip <- installed.packages()
pkgs.to.remove <- ip[!(ip[,"Priority"] %in% c("base", "recommended")), 1]
sapply(pkgs.to.remove, remove.packages)

【讨论】:

  • 您可以使用sapply(pkgs.to.remove, install.packages)重新安装它们
  • 我遇到了类似的问题(使用 IRKernel / rzmq),但卸载重新安装软件包并没有帮助;见:github.com/IRkernel/IRkernel/issues/237.
  • @CephBirk 那些不是从 CRAN 安装的包呢 :)?然后install.packages 不会检索它们
  • 就我而言,它不起作用。我的错误与utils::download.file 相关,并且仅在devtools::test() 运行时失败,并且仅在从rstudio 完成时失败。我实现的解决方案只是使用system("wget ...") 而不是download.file。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2010-10-07
  • 1970-01-01
  • 2022-01-22
  • 2012-10-10
  • 2014-10-30
相关资源
最近更新 更多