2013-08-15 3 views
2

나는 데에서 메모리 제한 "오류 : 크기의 벡터를 할당 할 수 없습니다 ... MB"문제 FF/ffdf 및 ffdfdply 기능을 사용.ffdfdply, 분할 및 R

나는 그룹으로 키가되어 많은 양의 데이터를 처리하는 FF와 ffdf 패키지를 사용하려고 해요. 고유 키가 같은 것을 사용하여 만든

x = 

id_1 id_2 month year Amount key 
    1  13  1 2013  -200  11 
    1  13  2 2013  300  54 
    2  19  1 2013  300  82 
    3  33  2 2013  300  70 

.... (10+ Million rows) 

: 키 변수를 사용하여 그룹화하여 요약

x$key = as.ff(as.integer(ikey(x[c("id_1","id_2","month","year")]))) 

, 내가이 명령을 :

(ffdf 테이블 형식) 데이터는 다음과 같습니다 data.table의 우수한 그룹화 기능 ( this discussion에서 가져온 아이디어)를 사용하여
summary = ffdfdply(x=x, split=x$key, FUN=function(df) { 
    df = data.table(df) 
    df = df[,list(id_1 = id_1[1], withdraw = sum(Amount*(Amount>0),na.rm=T), by = "key"] 
    df 
},trace=T) 

. 실제 코드에는 Amount 변수에 더 많은 함수를 적용 할 수 있지만이 경우에도 전체 ffdf 테이블을 처리 할 수는 없습니다 (테이블의 작은 하위 집합이 정상적으로 작동 함).

을주는 램의 엄청난 금액을 사용하여 ffdfdplyis 것 같아 :

Error: cannot allocate vector of size 64MB 

는 또한 BATCHBYTES 도움이하지 않는 것 같습니다. ffdffply에 대한 경험이있는 사람이라면 ffdf 테이블을 미리 분할하지 않고이 문제를 해결할 수있는 다른 방법을 추천 할 수 있습니까?

는 FF/ffbase을 사용하는 방법에 대한 가장 어려운 부분은하고있다

답변

5

확인 데이터가 FF에서 유지하고 실수로 RAM에 넣어 없습니다. 일단 데이터를 RAM에 저장하게되면 (주로 데이터가 RAM에 저장 될 때와 그렇지 않을 때의 오해 때문에) R에서 RAM을 다시 얻는 것이 어렵고 RAM 제한에서 작업하는 경우, RAM을 약간 추가로 요청하면 '오류 : 크기의 벡터를 할당 할 수 없습니다.'라는 메시지가 나타납니다.

지금, 나는 당신이 iKey에 대한 입력을 misspecified 생각합니다. ?ikey을 보면 입력 인수로 여러 ff 벡터가 아닌 ffdf가 필요합니다. 아마 당신이 원했던 것은 아마 동안이 그것은 내 컴퓨터에 일부 데이터를 시뮬레이션 ikey(x[c("id_1","id_2","month","year")])

24Mio 행과 ffdf를 얻기 위해 다음과 같이 사용하는 RAM에 데이터를 넣어 가지고, 다음은 그것을 사용하는 (나에게 문제를 RAM 제공하지 않습니다 내 컴퓨터의 RAM 약 3.5GB)

require(ffbase) 
require(data.table) 
x <- expand.ffgrid(id_1 = ffseq(1, 1000), id_2 = ffseq(1, 1000), year = as.ff(c(2012,2013)), month = as.ff(1:12)) 
x$Amount <- ffrandom(nrow(x), rnorm, mean = 10, sd = 5) 
x$key <- ikey(x[c("id_1","id_2","month","year")]) 
x$key <- as.character(x$key) 
summary <- ffdfdply(x, split=x$key, FUN=function(df) { 
    df <- data.table(df) 
    df <- df[, list(
    id_1 = id_1[1], 
    id_2 = id_2[1], 
    month = month[1], 
    year = year[1], 
    withdraw = sum(Amount*(Amount>0), na.rm=T) 
), by = key] 
    df 
}, trace=TRUE) 

는 또 다른 이유는 당신이에 대해 얘기하지 않는 RAM에 너무 많은 다른 데이터를 가지고있을 수 있습니다. 또한 ff에서 모든 요소 수준이 RAM에 있음을 표시하십시오. 많은 문자/요인 데이터로 작업하는 경우 문제가 될 수도 있습니다.이 경우 자신의 데이터에서 실제로 이러한 데이터가 필요한지 스스로에게 묻고 있어야합니다. 분석 여부.

+0

당신은 내가 질문에 입력 실수는 iKey에 대한 권리입니다. 나는 그것을 통해 당신의 방식으로 사용하고 있지만, as.integer는 문자가 아닙니다. 위의 수정. – tanvach

+0

필자는 ffsave/ffload를 사용하고 있기 때문에 문제가 너무 많다고 생각합니다. 많은 ff 데이터 세트를 보유하는 데 오랜 시간이 걸릴 것입니다. 내가 가져간 컬럼은 키잉 변수 (4 개의 키 컬럼이 있음)입니다. 이제 각 그룹별로 키잉을 다시 수행해야합니다. 이상적이지는 않지만 적어도 데이터는 메모리에 저장됩니다. – tanvach

+0

요약하면 다음과 같습니다. - 요인을 사용하지 마십시오. 그것은 모든 것을 늦출 것입니다. - 가능한 한 적은 수의 열을 유지하십시오. – tanvach