문자 개체가 있기 때문에 시간이 오래 걸릴 가능성이 가장 높습니다. 이것은 확실하지 않지만 크기를 결정하기 위해 문자 수를 계산해야하기 때문인 것으로 보입니다.
x<-rep(paste0(letters[1:3],collapse=""),1e8)
system.time(object.size(x))
## user system elapsed
## 1.608 0.592 2.202
x<-rep(0.5,1e9)
system.time(object.size(x))
## user system elapsed
## 0.000 0.000 0.001
우리는 긴 문자열이 같은 (적어도 일부의 경우에) 더 많은 공간을 차지 볼 수 있습니다 : 당신이 정확한 크기를 필요로하는 경우
> x<-replicate(1e5,paste0(letters[sample(26,3)],collapse=""))
> x1<-replicate(1e5,paste0(letters[sample(26,2)],collapse=""))
> object.size(x)
1547544 bytes
> object.size(x1)
831240 bytes
나는이 주변에 어떤 방법을 생각할 수 없다 . 그러나 대량의 행을 샘플링하고 샘플에서 object.size()
을 호출하여 행당 크기를 추정 한 다음 보유한 행의 총 수를 곱하면 매우 정확한 크기 추정치를 얻을 수 있습니다. 예를 들어
:
estObjectSize<-function(x,n=1e5){
length(x)*object.size(sample(x,n))/n
}
x0<-sapply(1:20,function(x) paste0(letters[1:x],collapse=""))
x<-x0[sample(20,1e8,T)]
> system.time(size<-object.size(x))
user system elapsed
1.632 0.856 2.495
> system.time(estSize<-estObjectSize(x))
user system elapsed
0.012 0.000 0.013
> size
800001184 bytes
> estSize
801184000 bytes
당신은이 데이터 프레임에 대한 작업을 얻기 위해 코드를 조금 조정할 필요가 있지만,이 아이디어입니다.
추가 할 내용 : 문자열 배열을 저장할 문자 당 바이트 수는 문자열 작성 중에 사용 된 문자열 인바운드 및 초과 할당 된 버퍼 메모리를 포함하여 몇 가지 사항에 따라 달라집니다. 확실히 문자열의 수를 곱하는 것만 큼 간단하지 않으며, 더 오래 걸리는 것은 당연한 일입니다.
> bytesPerString<-sapply(1:20,
+ function(x)
+ object.size(replicate(1e5,paste0(letters[sample(26,x)],collapse="")))/1e5)
> bytesPerString
[1] 8.01288 8.31240 15.47928 49.87848 55.71144 55.98552 55.99848 64.00040
[9] 64.00040 64.00040 64.00040 64.00040 64.00040 64.00040 64.00040 80.00040
[17] 80.00040 80.00040 80.00040 80.00040
> bytesPerChar<-(bytesPerString-8)/(1:20+1)
> bytesPerChar
[1] 0.0064400 0.1041333 1.8698200 8.3756960 7.9519067 6.8550743 5.9998100
[8] 6.2222667 5.6000400 5.0909455 4.6667000 4.3077231 4.0000286 3.7333600
[15] 3.5000250 4.2353176 4.0000222 3.7894947 3.6000200 3.4285905
'system ("ls -l DB.raw")'? (네가 현재 당신의 환경에 있고 파일 일 필요는 없다는 것을 안다.) 'object.size (unlist (DB.raw))'와 같은 것을 시도하거나'prod (dim (DB.raw)) * {요소 당 바이트 수}'를 사용하면 도움이됩니까? –
Carl,'unlist' 옵션 ('use.names = FALSE'와 함께)은 10 분 이상이고 아직 진행 중이 지 않습니다. 그렇기 때문에 좋은 제안입니다. 당신이 언급 한'system'은 실제로이 경우의 옵션이 아닙니다. –
duh,이 기계에는 8GB 밖에 없습니다. 'DB.raw'는 이미 5 + GB입니다. 만약 내가 그것을'unlist'하면 가난한 작은 컴퓨터가 기침을 시작합니다 –