오류: C 스택 사용량이 제한에 너무 가깝습니다.
R에서 상당히 깊은 재귀 코드를 실행하려고 하는데 계속 다음과 같은 오류가 발생합니다.
오류: C 스택 사용량이 제한에 너무 가깝습니다.
내출에서 출력한 CStack_info()
다음과 같습니다.
Cstack_info()
size current direction eval_depth
67108864 8120 1 2
저는 제 기계에 메모리가 충분합니다. 어떻게 하면 R에 대한 CS 스택을 늘릴 수 있는지 알고 싶습니다.
편집: 누군가가 재현 가능한 예를 요청했습니다.다음은 문제의 원인이 되는 몇 가지 기본 샘플 코드입니다.f(1,1)를 몇 번 실행하면 오류가 발생합니다.이미 --max-ppsize = 500000 및 옵션(제한사항 = 500000)을 설정했으므로 설정하지 않으면 두 가지 중 하나에 대한 오류가 대신 발생할 수 있습니다.보시다시피, 재귀는 여기서 꽤 깊게 진행될 수 있고 어떻게 하면 지속적으로 작동할 수 있는지 모르겠습니다.감사해요.
f <- function(root=1,lambda=1) {
x <- c(0,1);
prob <- c(1/(lambda+1),lambda/(lambda+1));
repeat {
if(root == 0) {
break;
}
else {
child <- sample(x,2,replace=TRUE,prob);
if(child[1] == 0 && child[2] == 0) {
break;
}
if(child[1] == 1) {
child[1] <- f(root=child[1],lambda);
}
if(child[2] == 1 && child[1] == 0) {
child[2] <- f(root=child[2],lambda);
}
}
if(child[1] == 0 && child[2] == 0) {
break;
}
if(child[1] == 1 || child[2] == 1) {
root <- sample(x,1,replace=TRUE,prob);
}
}
return(root)
}
스택 크기는 프로세스별로 조정 가능한 운영 체제 매개 변수입니다( 참조).제가 알기로는 R 내에서 조정할 수 없지만, R을 시작하기 전에 셸에서 조정할 수 있습니다.ulimit
같이 합니다.다음과 같이 작동합니다.
$ ulimit -s # print default
8192
$ R --slave -e 'Cstack_info()["size"]'
size
8388608
* 은 8388608 = 1024 * 8192와 . R은 R입니다.ulimit -s
킬로바이트가 아닌 바이트 단위로 표시됩니다.
$ ulimit -s 16384 # enlarge stack limit to 16 megs
$ R --slave -e 'Cstack_info()["size"]'
size
16777216
하려면 이설을영로조다추면다니가합을 합니다.ulimit
셸 시작 파일에 대한 명령을 사용하여 로그인할 때마다 실행됩니다.그것보다 더 구체적인 방향은 말씀드릴 수 없습니다. 왜냐하면 그것은 당신이 정확히 어떤 껍질을 가지고 있는지와 그런 것들에 달려있기 때문입니다.그래픽 환경에 로그인하는 방법도 모릅니다(터미널 창에서 R을 실행하지 않는 경우 관련이 있음).
스택 한계와 상관없이 너무 깊은 재귀를 초래할 것으로 생각합니다.예를 들어 람다 = Inf의 경우 f(1)은 무한히 즉시 재귀를 유도합니다.재귀의 깊이는 현재 재귀를 끝낼 확률이 1/r인 랜덤 워크인 것 같습니다.스택 한계에 도달할 때까지 많은 단계를 '더 깊이'했습니다.이것은 r > 1 / 2, 그리고 대부분의 시간이 계속 반복된다는 것을 의미합니다.
또한 무한 재귀에도 불구하고 분석적이거나 최소한 수치적인 해결책을 도출하는 것이 거의 가능할 것으로 보입니다.p를 f(1) == 1 확률로 정의하고, 단일 반복 후 '자녀' 상태에 대한 암시적 표현을 작성하고, 이를 p와 동일시하며, solve.p를 이항 분포에서 단일 추첨의 성공 확률로 사용할 수 있습니다.
이 오류는 메모리 때문이 아니라 재귀 때문입니다.함수가 호출됩니다.이것은 오직 하나의 기능의 정의를 검토하는 것에서 항상 명백한 것은 아닙니다.이 점을 설명하기 위해 다음은 서로 호출하는 두 가지 함수의 최소 예입니다.
change_to_factor <- function(x){
x <- change_to_character(x)
as.factor(x)
}
change_to_character <- function(x){
x <- change_to_factor(x)
as.character(x)
}
change_to_character("1")
오류: C 스택 사용량 7971600이 제한에 너무 가깝습니다.
함수들은 계속해서 서로를 재귀적으로 호출할 것이며, 이론적으로 절대 완료되지 않을 것이며, 한계를 늘린다고 해도 여전히 초과될 것입니다.시스템 내에서 이러한 작업이 무기한으로 발생하여 시스템의 모든 계산 리소스를 사용하지 않도록 하는 것은 검사뿐입니다.함수가 자신 또는 서로를 무한히 반복적으로 호출하지 않도록 함수를 변경해야 합니다.
이것은 완전히 다른 이유로 저에게 일어났습니다.두 개의 열을 결합하는 동안 실수로 초긴 문자열을 만들었습니다.
output_table_subset = mutate(big_data_frame,
combined_table = paste0(first_part, second_part, col = "_"))
대신에
output_table_subset = mutate(big_data_frame,
combined_table = paste0(first_part, second_part, sep = "_"))
페이스트로 인해 문제가 발생할 것이라고는 전혀 예상하지 못했기 때문에 저는 그것을 알아내는 데 영원히 걸렸습니다.
"C 스택 사용량이 너무 제한에 가깝습니다." 오류가 발생하는 것과 같은 문제가 발생했습니다(비록 위의 사용자 2045093이 언급한 것과 다른 응용 프로그램의 경우).저는 zwol의 제안을 시도해 보았지만 잘 되지 않았습니다.
놀랍게도 저는 R Studio와 함께 작업하고 있기 때문에 OS X용 R 최신 버전(현재 버전 3.2.3)과 OS X용 R Studio 최신 버전(현재 버전 0.99.840)을 설치하여 문제를 해결할 수 있었습니다.
이것이 당신에게도 도움이 되기를 바랍니다.
제 경우는 좀 더 독특한 경우일 수도 있지만, 이러한 정확한 문제를 가진 소수의 사람들에게 도움이 될 수도 있습니다.
제 사례는 공간 사용과 전혀 관련이 없지만, R은 여전히 다음과 같이 답했습니다.
C stack usage is too close to the limit
기본 기능의 업그레이드인 정의된 기능이 있었습니다.
저장 RDS()
그렇지만,
실수로, 이 정의된 함수는 다음과 같이 불렸습니다.saveRDS()
대신에safe_saveRDS()
.
따라서, 그 정의를 지나, 코드가 실제로 사용하는 라인에 도달했을 때saveRDS(...)
(업그레이드 버전이 아닌 원래 기본 버전을 호출함), 위의 오류를 주고 찌그러짐.
따라서 일부 저장 기능을 호출할 때 오류가 발생하면 실수로 오류를 범하지 않았는지 확인하십시오.
여기서 한 가지 문제는 당신이 전화하고 있다는 것일 수 있습니다.f
plop <- function(a = 2){
pouet <- sample(a)
plop(pouet)
}
plop()
Erreur : évaluations trop profondément imbriquées : récursion infinie / options(expressions=) ?
Erreur pendant l'emballage (wrapup) : évaluations trop profondément imbriquées : récursion infinie / options(expressions=) ?
리눅스에서 나는 스택과 memlock 메모리의 크기를 영구적으로 늘렸습니다.
sudo vi /etc/security/limits.conf
그런 다음 파일 끝에 다음 행을 추가합니다.
* soft memlock unlimited
* hard memlock unlimited
* soft stack unlimited
* hard stack unlimited
참고로 Windows 7(64비트)에서 R 3.6.1을 사용하는 경우 갑자기 이 문제가 발생합니다.이전에는 문제가 되지 않았고, 이제는 데이터를 "저장(.)"하거나 "저장 이미지(.)"를 수행하려고 하면 스택 한계가 곳곳에서 나타나는 것 같습니다.연쇄반응이 이 스택들을 날려버리는 것과 같습니다.
3.6.0으로 되돌리는 것을 진지하게 고려 중입니다.거기서 일어난 일이 아닙니다.
는 종종 아웃된 는나종종코아포다함니합웃을트멘을 합니다.source("path/to/file/thefile.R")
예를 들어 R 스크립트의 맨 위에 있는 줄입니다.thefile.R
터미널에 쉽게 복사하여 붙여넣어서 실행할 수 있습니다.파일을 실행하면 파일을 실행하고 파일을 실행하므로 줄에 주석을 다는 것을 잊으면 이 오류가 발생합니다.
그것이 원인이라면 해결책은 간단합니다. 선을 주석으로 달아야 합니다.
여기에 문제를 나열하는지는 잘 모르겠지만 저는 문제가 발생했습니다.leaflet()
가 있는 데이터 을 매핑하려고 했습니다.date
컬은클니다습였래스입니다.POSIXlt
다시로변경으로 POSIXct
문제를 해결했습니다.
저도 같은 문제에 직면했습니다.이 문제는 R 또는 R studio를 다시 설치하거나 스택 크기를 늘려서 해결할 수 없습니다.여기 이 문제를 해결한 해결책이 있습니다.
a를 소싱하는 경우.R inside b.R과 동시에 소스 b.R 안에 있으면, 스택이 매우 빠르게 채워질 것입니다.
문제
은 첫 번째 파일입니다.a.R
어느 곳에서b.R
:
#---- a.R File -----
source("/b.R")
...
...
#--------------------
은 두 번째 파일입니다.b.R
어느 곳에서a.R
:
#---- b.R File -----
source("/a.R")
...
...
#--------------------
솔루션 서로 내에서 파일을 반복적으로 호출하지 않도록 하나의 파일만 소스로 지정합니다.
#---- a.R File -----
source("/b.R")
...
...
#--------------------
#---- b.R File -----
...
...
#--------------------
OR
#---- a.R File -----
...
...
...
#--------------------
#---- b.R File -----
source("/a.R")
...
...
#--------------------
마틴 모건이 썼듯이...문제는 여러분이 재귀 속으로 너무 깊이 들어간다는 것입니다.만약 재귀가 전혀 수렴되지 않는다면, 당신은 스스로 그것을 깰 필요가 있습니다.테스트되지 않았기 때문에 이 코드가 작동하기를 바랍니다.하지만 여기서 적어도 한 가지는 분명해야 합니다.
f <- function(root=1,lambda=1,depth=1) {
if(depth > 256){
return(NA)
}
x <- c(0,1);
prob <- c(1/(lambda+1),lambda/(lambda+1));
repeat {
if(root == 0) {
break;
} else {
child <- sample(x,2,replace=TRUE,prob);
if(child[1] == 0 && child[2] == 0) {
break;
}
if(child[1] == 1) {
child[1] <- f(root=child[1],lambda,depth+1);
}
if(child[2] == 1 && child[1] == 0) {
child[2] <- f(root=child[2],lambda,depth+1);
}
}
if(child[1] == NA | child[2] == NA){
return NA;
}
if(child[1] == 0 && child[2] == 0) {
break;
}
if(child[1] == 1 || child[2] == 1) {
root <- sample(x,1,replace=TRUE,prob);
}
}
return(root)
}
plot_ly를 사용하는 경우 전달할 열을 확인합니다.POSIXdt/ct 열의 경우 플롯으로 전달하기 전에 as.character()를 사용해야 합니다. 그렇지 않으면 이 예외가 발생합니다!
이 오류 메시지가 표시된 방법은 다음과 같습니다.콘솔에서 data.table을 인쇄할 때 이 오류 메시지가 표시되었습니다.알고 보니 제가 실수로 (하면 안 될 때 붙여넣기()에서 접기를 사용하여) 열에 초장끈을 만들었기 때문이었습니다.
키지caret
에는 라기능있습다라는 .createDataPartition
분할할 데이터 집합의 행 수가 1m를 초과하면 항상 오류가 발생합니다.참고만 해주세요.
동일한 문제를 발생시키는 또 다른 방법:
library(debug)
mtrace(lapply)
여기서는 재귀적인 호출이 그렇게 명확하지 않습니다.
언급URL : https://stackoverflow.com/questions/14719349/error-c-stack-usage-is-too-close-to-the-limit
'itsource' 카테고리의 다른 글
SELECT max(x)가 null을 반환합니다. 0을 반환하려면 어떻게 해야 합니까? (0) | 2023.06.21 |
---|---|
Android - Firebase - TaskSnapshot - Method는 개인 범위 내에서만 액세스해야 합니까? (0) | 2023.06.21 |
PyCrypto AES-256을 사용한 암호화 및 암호 해독 (0) | 2023.06.21 |
동적 vuex 모듈과 새 클래스를 등록하는 중 (0) | 2023.06.21 |
PATINDEX 패턴 인수에서 밑줄 문자를 이스케이프하는 방법은 무엇입니까? (0) | 2023.06.21 |