2013-10-09 3 views
1

여러 개의 JSON 개체로 구성된 파일이 있습니다. 이러한 파일을 읽고 JSON 개체에서 특정 필드를 추출해야합니다. 사물을 복잡하게하기 위해 일부 객체에는 모든 필드가 포함되어 있지 않습니다. JSON 객체가 200,000 개가 넘는 대용량 파일을 다루고 있습니다. 여러 코어에 작업을 분할하고 싶습니다. doSNOW, foreach 및 parallel을 실험 해 보았습니다. 실제로이 작업을 수행하는 방법을 이해하지 못합니다. 다음은 내 코드를 더 효율적으로 만들고 싶습니다. 오히려 반복을 병렬 처리하는 것보다병렬 프로그래밍 R

foreach (i in 2:length(linn)) %dopar% { 
    json_data <- fromJSON(linn[i]) 


    if(names(json_data)[1]=="info") 
    next 

    mLocation <- ifelse('location' %!in% names(json_data$actor),'NULL',json_data$actor$location$displayName) 
    mRetweetCount <- ifelse('retweetCount' %!in% names(json_data),0,json_data$retweetCount) 
    mGeo <- ifelse('geo' %!in% names(json_data),c(-0,-0),json_data$geo$coordinates) 

    tweet <- rbind(tweet, 
       data.frame(
       record.no  =  i, 
       id    =  json_data$id, 
       objecttype  =  json_data$actor$objectType, 
       postedtime  =  json_data$actor$postedTime, 
       location   =  mLocation, 
       displayname  =  json_data$generator$displayName, 
       link    =  json_data$generator$link, 
       body    =  json_data$body, 
       retweetcount  =  mRetweetCount, 
       geo    =  mGeo) 
       ) 

} 
+0

그것은 당신이 SO 올바르게 코드 덩어리를 게시 배운 시간에 분석 속이고 있다고 생각. (또한'%! in %'은 표준 연산자가 아닙니다 ...이 코드를 실행하기 위해 의존하는 모든 패키지의 이름을 포함시켜야합니다. –

답변

2

, 나는 (... 실제로, 흠 여전히 반복되는 아래의 대부분을)은 벡터화하려고 더 좋을 것 같아요. 여기에 예를 들어 우리는 우리의 모든 기록 location를 들어

json_data <- lapply(linn, fromJSON) 

(하지만 아직 속도 이득이 ... 아래 참조) 얻을 우리 미리 할당 한 후, 어떤 위치에 존재하지 않은 기록을 대표 찾을 수 NAs의 벡터를을 기록 (아마도이 ​​일을 더 나은 방법이 ...) 위치를 가지고 오히려 '사본보다 (단일 통화에 20 만 행 데이터 프레임을 생성,

mLocation <- rep(NA, length(json_data)) 
idx <- sapply(json_data, function(x) "location" %in% names(x$actor)) 
mLocation[idx] <- sapply(json_data[idx], function(x) x$location$displayName) 

마지막으로 업데이트하고 append '패턴을 사용하면 첫 번째 행, 첫 번째 행과 두 번째 행, 그리고 첫 번째, 두 번째, 세 번째 행, th en ... 그래서 N - 제곱 행, 요소 및 기타 data.frame 특정 비용 재현 이외에; 모든 열을 축적하는 것) 시간의

data.frame(i=seq_along(json_data), location=mLocation) 

생각을 대부분을 지출하고 data.frame()에 하나의 호출을 할 곳은 가능성이 높습니다. 난 당신이 JSON 배열을 repersenting 하나의 문자열로 모든 것을 붙여, 라인에서-A-시간을 분석하고, 하나의 호출

json_data <- fromJSON(sprintf("[%s]", paste(linn, collapse=","))) 
+0

게시물에 대해 생각하게되었습니다. 행렬 행렬을 만들었습니다. 그 다음 필요에 따라 값을 삽입 한 다음 데이터 프레임으로 변환했습니다. 훨씬 나아졌습니다. 감사합니다. – Brandon