2013-10-23 2 views
3

object.size이 아닌 객체 크기를 더 빨리 식별 할 수있는 방법 (또는 더 빨리 실행하는 방법)이 있습니까?object.size보다 빠른 대안?

start.time <- Sys.time() 
object.size(DB.raw) 
# 5361302280 bytes 
Sys.time() - start.time 
# Time difference of 1.644485 mins <~~~ A minute and a half simply 
              to show the size 

print.dims(DB.raw) 
# 43,581,894 rows X 15 cols 

왜 개체 크기를 계산하는 데 너무 오래 걸리는지 궁금합니다. 아마도 각 열에 대해 해당 열의 전체 크기를 찾기 위해 각 행을 통과해야합니까?

+0

'system ("ls -l DB.raw")'? (네가 현재 당신의 환경에 있고 파일 일 필요는 없다는 것을 안다.) 'object.size (unlist (DB.raw))'와 같은 것을 시도하거나'prod (dim (DB.raw)) * {요소 당 바이트 수}'를 사용하면 도움이됩니까? –

+0

Carl,'unlist' 옵션 ('use.names = FALSE'와 함께)은 10 분 이상이고 아직 진행 중이 지 않습니다. 그렇기 때문에 좋은 제안입니다. 당신이 언급 한'system'은 실제로이 경우의 옵션이 아닙니다. –

+1

duh,이 기계에는 8GB 밖에 없습니다. 'DB.raw'는 이미 5 + GB입니다. 만약 내가 그것을'unlist'하면 가난한 작은 컴퓨터가 기침을 시작합니다 –

답변

6

Windows 상자의 경우 DB.raw을 생성하기 전후에 gc()memory.size()을 사용하여 매우 가까운 추정치를 얻을 수 있습니다.

gc() 
x <- memory.size() 
# DB.raw created, extra variables rm'ed 
gc() 
memory.size() - x # estimate of DB.raw size in Mb 
# object.size(DB.raw)/1048576 # for comparison 
+1

불행히도 ...'경고 메시지 : 'memory.size()'는 Windows 전용입니다 ' –

+0

버머입니다. 유사한 상황에서 일부 Windows 사용자에게 도움이 될 수 있도록 답변을 남겨 두겠습니다. –

+0

옙 절대적으로. 좋은 아이디어를 얻으려면 +1 –

2

문자 개체가 있기 때문에 시간이 오래 걸릴 가능성이 가장 높습니다. 이것은 확실하지 않지만 크기를 결정하기 위해 문자 수를 계산해야하기 때문인 것으로 보입니다.

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 
+0

나는 그것이 잘못되었다는 사실을 의심하지 않는다고 (당신이 발견 한대로) 말할 것입니다. 내가 측정하려고하는 부분은 다른 클래스의 열을 변환하여 얼마나 많은 메모리를 잃고 얻는지를 나타내는 것이고 다른 크기의 변환에 대해서는 객체 크기를 표시하는 데 거의 같은 시간이 걸린다. –

+1

글자는 숫자 유형보다 확실히 오래 걸린다. 내 최신 편집을 참조하십시오. 어떤 경우에는 문자열 길이가 문자 객체의 크기에 영향을주는 것처럼 보입니다. R이 어떤 문자열이 실제로 같은 문자 배열에 대한 포인터인지를 추적하려고하는지 궁금합니다. 이와 같은 크기를 계산할 때. – mrip

+0

@mrip 예, R에는 전역 문자열 풀이 있으므로 벡터의 크기를 계산할 때 고유 한 개수를 결정해야하므로 벡터 크기를 계산하는 것은 어렵습니다. 'object.size ("banana")'와'object.size (rep ("banana", 1e6))/1e6'을 비교하십시오. – hadley

관련 문제