【问题标题】:segfault in R using reshape2 package and dcastR中的段错误使用reshape2包和dcast
【发布时间】:2013-02-20 07:16:24
【问题描述】:

当我尝试使用dcast(来自reshape2 包)重塑特定数据框时,RStudio 崩溃了。我发现崩溃实际上是在 R 本身中发生的,所以我在 R.app 中运行了我的强制转换代码,并得到了为该站点命名的错误类型:Error: segfault from C stack overflow。在 Google 和 SO 的帮助下,我了解到这是一个内存访问错误。

好的,我已经做到了,但我不知道从这里去哪里。我无法提供一个真正可重现的示例,因为我的数据框大约有 558,000 行,并且在小型玩具示例上不会出现问题。例如,即使我采用 50,000 行的数据子集,dcast 也可以正常工作。是否存在导致问题的特定数据行?如果是这样,任何人都可以建议寻找哪些功能可能导致我遇到的错误类型?

这是我从中转换的数据框的一个子集(一些变量的假值),然后是我正在使用的转换函数。我还在下面的dput 函数中包含了这个小的数据sn-p,以防万一使用它会有所帮助。真实数据集有大约700个prog值,15个prog1值,5个fa.type值。

  id        term   yr    nslds acad.lev    prog            prog1 fa.type amount
1  1   Fall 2009 2010 Graduate Graduate  loan 1      Other Loans    Loan   5000
2  1 Spring 2010 2010 Graduate Graduate  loan 1      Other Loans    Loan   5000
3  2   Fall 2009 2010 Graduate Graduate  loan 2    Stafford Loan    Loan   8781
4  2 Spring 2010 2010 Graduate Graduate  loan 2    Stafford Loan    Loan   8781
5  3   Fall 2007 2008 Graduate Graduate  loan 3    Stafford Loan    Loan   4250
6  3   Fall 2007 2008 Graduate Graduate grant 1 University Grant   Grant   1707

fa.wide = dcast(id + term + yr + nslds + acad.lev ~ prog1 + fa.type , data=fa, value.var="amount", fun.aggregate=sum)

fa = structure(list(id = c(1, 1, 2, 2, 3, 3), term = structure(c(7L, 
8L, 7L, 8L, 1L, 1L), .Label = c("Fall 2007", "Spring 2008", "Summer 2008", 
"Fall 2008", "Spring 2009", "Summer 2009", "Fall 2009", "Spring 2010", 
"Summer 2010", "Fall 2010", "Spring 2011", "Summer 2011", "Fall 2011", 
"Spring 2012", "Summer 2012", "Fall 2012", "Spring 2013"), class = c("ordered", 
"factor")), yr = c(2010L, 2010L, 2010L, 2010L, 2008L, 2008L), 
    nslds = structure(c(7L, 7L, 7L, 7L, 7L, 7L), .Label = c("1st Year, Never Attended", 
    "1st Year, Previously Attended", "2nd Year", "3rd Year", 
    "4th Year", "5th Year+", "Graduate"), class = c("ordered", 
    "factor")), acad.lev = structure(c(6L, 6L, 6L, 6L, 6L, 6L
    ), .Label = c("Freshman", "Sophomore", "Junior", "Senior", 
    "PB Undergrad", "Graduate"), class = c("ordered", "factor"
    )), prog = c("loan 1", "loan 1", "loan 2", "loan 2", "loan 3", 
    "grant 1"), prog1 = c("Other Loans", "Other Loans", "Stafford Loan", 
    "Stafford Loan", "Stafford Loan", "University Grant"), fa.type = structure(c(3L, 
    3L, 3L, 3L, 3L, 2L), .Label = c("Athletic", "Grant", "Loan", 
    "Scholarship", "Waiver", "Work/Study"), class = "factor"), 
    amount = c(5000, 5000, 8781, 8781, 4250, 1707)), .Names = c("id", 
"term", "yr", "nslds", "acad.lev", "prog", "prog1", "fa.type", 
"amount"), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

  • 也许您可以将数据切割成更小的部分,在每个部分上运行 dcast,然后再将它们绑定在一起。
  • 如果必须的话我会(或者我会尝试从基础 R 或原始 reshape 包中使用不同的重塑功能),但我想在未来深入了解参考并在 SO 上找到解决方案,以防其他人遇到类似问题。
  • 1.您应该在github.com/hadley/reshape 将此问题报告为问题。您可以先尝试聚合(使用 data.table),然后重新调整为宽格式 - 如果这导致了段错误,这可能会减小问题的大小。
  • 我已经报告了这个问题。谢谢你的建议。另外,我可以使用rehshape 包中的cast 函数来重新调整我的数据,但我仍然想知道是什么导致了这个错误。如果@Hadley 和他的团队在 Github 上报告任何内容,我会在这里发布。
  • 我知道这可能会很痛苦,但如果您可以尝试发布一些代码来模拟一些重现错误的数据,这将非常有帮助。

标签: r segmentation-fault reshape2


【解决方案1】:

只是为了结束这个老问题,这是一个已修复的错误,如 this github issue 中所述。

【讨论】:

    【解决方案2】:

    我在使用 reshape2 包中的 dcast 将长表旋转为宽表时遇到了同样的问题。我在这篇帖子plyr split_indices function crashes for long vectors 中找到了解决方案。具体来说,您可以在此页面https://github.com/hadley/plyr/tree/master/src 中下载 split_numeric.c 和 loop-apply.c。从 R 控制台卸载包 plyr,最后在本地重新安装包: install.packages('/path/to/source', repos=NULL, type='source')。

    这解决了我的问题,希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      这不是一个答案,而是一个不适合 cmets 的简单(无意义)可重现示例。您可以使用这个简单的示例(在我的 MacBookPro 上)重新创建此错误。

      require(reshape2)
      n = 1448
      df <- data.frame( Student = rep( 1:n , each = 2 ) , Grade = sample( 100 , n*2 , repl = TRUE ) )
      df2 <- dcast( df , Student ~ Student , value.var = "Grade" , sum )
      Error: segfault from C stack overflow
      

      错误发生在边界n = 1448,即n=1447及以下时不会发生。似乎错误来自包plyr中的split-numeric.c中的split_indices。这可能与分组级别数被分配给一个(无符号?)整数值这一事实有关,如果组数超过 32767,它会导致内存访问错误,但 TBH 我现在正抓着稻草.

      我的sessionInfo() 以防万一有人无法重现此错误:

      R version 2.15.2 (2012-10-26)
      Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
      
      locale:
      [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
      
      attached base packages:
      [1] stats     graphics  grDevices utils     datasets  methods   base     
      
      other attached packages:
      [1] reshape2_1.2.2
      
      loaded via a namespace (and not attached):
      [1] plyr_1.8      stringr_0.6.2
      

      有趣的是,如果我在收到第一个错误后再次运行df2 &lt;- 命令,R 会完全崩溃,我会收到一些操作系统生成的错误报告。我在此处包含崩溃日志的相关部分:

      Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
      Exception Codes: KERN_PROTECTION_FAILURE at 0x00007fff5f3ff120
      
      VM Regions Near 0x7fff5f3ff120:
          JS JIT generated code  00004d431a401000-00004d431a402000 [    4K] ---/rwx SM=NUL  
      --> STACK GUARD            00007fff5bc00000-00007fff5f400000 [ 56.0M] ---/rwx SM=NUL  stack guard for thread 0
          Stack                  00007fff5f400000-00007fff5fc00000 [ 8192K] rw-/rwx SM=COW  thread 0
      
      Application Specific Information:
      objc[57147]: garbage collection is OFF
      
      Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
      0   libsystem_c.dylib               0x00007fff897c4632 small_free_scan_madvise_free + 41
      1   libsystem_c.dylib               0x00007fff897c5f06 szone_free_definite_size + 4186
      2   libsystem_c.dylib               0x00007fff897fe789 free + 194
      3   libR.dylib                      0x0000000100222dbf R_gc_internal + 7327 (memory.c:952)
      4   libR.dylib                      0x0000000100224919 Rf_allocVector + 841 (memory.c:2356)
      5   plyr.so                         0x000000010144bd2c split_indices + 204 (split-numeric.c:23)
      6   libR.dylib                      0x00000001001b4cc7 do_dotcall + 16311 (dotcode.c:593)
      7   libR.dylib                      0x00000001001e4448 Rf_eval + 1672 (eval.c:494)
      8   libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
      9   libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      10  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
      11  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
      12  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
      13  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      14  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
      15  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      16  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
      17  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
      18  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
      19  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      20  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
      21  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      22  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      23  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
      24  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      25  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
      26  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
      27  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
      28  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      29  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
      30  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      31  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
      32  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
      33  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
      34  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
      35  libR.dylib                      0x000000010021c761 R_ReplDLLdo1 + 481 (main.c:362)
      36  org.R-project.R                 0x0000000100022c24 run_REngineRmainloop + 196
      37  org.R-project.R                 0x00000001000159b7 -[REngine runREPL] + 119
      38  org.R-project.R                 0x0000000100001f24 main + 852
      39  org.R-project.R                 0x0000000100001914 start + 52
      

      【讨论】:

      • @hadley 我是否应该为此提交错误报告,因为我可以重现此崩溃?
      • 嗨@SimonO101 你能解决这个问题吗?我在 R 版本 3.0.1 上遇到了完全相同的问题...
      • 哼...@SimonO101,有什么建议吗?将数据帧分成几个,然后再次运行 dcast?谢谢!
      • @GodinA 暂时使用reshape 包中的cast 函数。它的工作方式与dcast 基本相同,但不受段错误的影响(据我所知)。
      • @djhurio 这与 R 版本更改无关,而是在包中修复了该错误。见Reshape fix #31
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      相关资源
      最近更新 更多