lapply
함수 또는 루프에서 가비지 콜렉션을 수행하는 가장 빠른 방법은 무엇입니까? 내가보기에 명백한 것은 엄청나게 느려집니다. 내가 잘못하고 있니? 더 빠른 방법이 있습니까? 내 실제 유스 케이스에서는lapply에서 가비지 콜렉션 속도 향상
x <- 1:10000
system.time(xx <- lapply(1:length(x), function(xi) sum(x[1:xi])))
user system elapsed
0.02 0.00 0.02
system.time(xx <- lapply(1:length(x), function(xi) sum(x[1:xi], invisible(gc(v=FALSE)))))
user system elapsed
22.49 0.00 22.57 # a thousand times increase in time taken!!
함수는 좀 더 복잡하고 각 인스턴스 후에 gc
없이 실패. 덜 편리한 RAM이있는 컴퓨터로 전환 할 수 있으므로 더 빠른 gc
메서드를 사용할 수 있는지 궁금합니다.
x <- 1:10000
system.time(x1 <- lapply(1:length(x), function(xi) sum(x[1:xi])))
user system elapsed
3.47 0.00 3.56
# define a function to make a sequence of a function followed by gc
sum_gc <- function(x) sum(x); invisible(gc(v=FALSE))
system.time(x3 <- lapply(1:length(x), function(xi) sum_gc(x[1:xi])))
user system elapsed
3.52 0.02 3.56
: 약간의 물건을 정리 마틴 모건의 제안에 따라
UPDATE는 gc
(지금 타이밍은 위에서 다른 이유는 다른 컴퓨터에서 작업)없이 lapply
에 닫습니다 속도를 제공합니다
매 반복마다 실제로 'gc'를 호출해야합니까? 100 단계 또는 그와 비슷한 것을 매번 호출하는 것으로 충분할 수 있습니다. RAM을 적게 사용하도록 기능을 최적화 할 수 있습니까? 물론 RAM을 더 확보 할 수 있다면 나쁜 생각은 아닙니다. – Roland
하나는'gc'를 직접 호출 할 필요가 거의 없습니다! 나는 현재 예제에서 메모리 사용을 위해 아무 것도하지 않는다고 생각한다. 구문은 이상합니다. - gc에 대한 호출 결과를 sum의 인수로 제공하고 있습니다! 종종 메모리 및 성능 문제에 대한 해결책은 더 큰 시스템이 아닌 더 나은 알고리즘입니다. –