2012-11-26 5 views
6

R과 병행하여 단일 멀티 코어 시스템의 단일 텍스트 파일을 반복 할 수 있습니까? 컨텍스트의 경우 텍스트 파일은 250-400MB 사이의 JSON 출력 사이에 있습니다.R 내에서 병렬로 readLine을 실행할 수 있습니까?

편집 :

다음은 내가 놀았 던 몇 가지 코드 샘플입니다. 놀랍게도, 병렬 처리가 성공하지 못했습니다 - 단지 기본 응용 프로그램 - 그러나 이것은 내 부분의 사용자 오류 때문일 수 있습니다. 또한 많은 수의 큰 파일을 읽으려고 할 때 내 컴퓨터가 막혔습니다. 여기

## test on first 100 rows of 1 twitter file 
library(rjson) 
library(parallel) 
library(foreach) 
library(plyr) 
N = 100 
library(rbenchmark) 
mc.cores <- detectCores() 
benchmark(lapply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      llply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON, 
        mc.cores=mc.cores), 
      foreach(x=readLines(FILE, n=N, warn=FALSE)) %do% fromJSON(x), 
      replications=100) 

인해 비 병렬 파일 시스템 IO의 성격에 두 번째 코드 샘플

parseData <- function(x) { 
    x <- tryCatch(fromJSON(x), 
       error=function(e) return(list()) 
       ) 
    ## need to do a test to see if valid data, if so ,save out the files 
    if (!is.null(x$id_str)) { 
    x$created_at <- strptime(x$created_at,"%a %b %e %H:%M:%S %z %Y") 
    fname <- paste("rdata/", 
        format(x$created_at, "%m"), 
        format(x$created_at, "%d"), 
        format(x$created_at, "%Y"), 
        "_", 
        x$id_str, 
        sep="") 
    saveRDS(x, fname) 
    rm(x, fname) 
    gc(verbose=FALSE) 
    } 
} 

t3 <- system.time(lapply(readLines(FILES[1], n=-1, warn=FALSE), parseData)) 
+0

JSON 파일을 읽거나 JSON 파일을 구문 분석하는 데 문제가 있습니까? –

+0

아니요. 간단한 for 루프를 사용하려고 할 때 내 컴퓨터가 결국 멈 춥니 다. 각 JSON 항목에 대해 함수를 실행하고, 다시 읽기 위해 별도의 rds 파일을 저장하는 등의 작업을 시도했습니다. 모든 옵션을 통해 메모리 사용을 의식하고 가능한 경우 최적화 및 정리를 시도합니다. 몇 가지 아이디어가 끔찍했지만 결국에는 Base R만으로 더 큰 데이터 세트를 "분석"하는 방법을 찾아 내고 더 나은 솔루션이 존재한다는 사실을 무시하고 싶습니다. – Btibert3

+0

재생산 가능한 예제는 우리가 피드백을 제공하는 것이 훨씬 쉬워 질 것입니다. –

답변

7

대답은 무엇을에 따라 달라집니다 사실 문제는 병렬로 파일을 읽거나 병렬로 파일을 처리하는 것입니다. 병렬

에 읽기

당신은, 예를 들어, 여러 입력 파일로 JSON 파일을 분할하여 병렬로 읽을 수 병렬 백엔드와 결합 plyr 기능을 사용하여 :

result = ldply(list.files(pattern = ".json"), readJSON, .parallel = TRUE) 

백엔드를 등록하면 아마 이제 기본 R.에 통합 된 parallel 패키지를 사용하여 수행 할 수 있습니다 또는 당신은 doSNOW 패키지를 사용 자세한 내용은 this post on my blog 볼 수 있습니다.

처리는 가장 좋은 건 문자의 벡터로 전체 데이터 집합을 읽는 것입니다이 시나리오에서는

병렬

에 데이터를 분할하고, 예를 들어 결합 병렬 백엔드를 사용 plyr 기능.

+1

좋지 않은 생각입니다. 그리고 파일을 잘라내는 방법을 찾고 있다면, UNIX'split' 명령을 살펴보십시오. –

+0

리눅스 명령은 항상 좋은 해결책입니다;) –

+0

@JeffAllen 흥미 롭습니다.미리 명령으로 데이터를 사전 처리하는 것을 생각하지 않았습니다. 커맨드 라인의 전문가는 아니지만 더 많이 찌를수록 몇 가지 명령이 얼마나 강력한 지 알 수 있습니다. – Btibert3

2

아마와 readLines()입니다. 물론, 병렬 NFS 나 HDFS와 같은 것을 사용한다면,이 제한은 적용되지 않을 것입니다. 그러나 "표준"아키텍처를 사용한다고 가정하면 readLine() 호출을 병렬화하는 것은 불가능합니다.

가장 좋은 방법은 아마도 아마도 다음, 메모리에 맞지 당신이 개체가 이미 읽어있어 일단 처리를 병렬화 < 500메가바이트으로보고 전체 파일을 읽을 수있을 것이다.

+0

+1하지만 약간의 작업으로 주어진 파일 연결에서 읽어야하는 각 작업자에게 줄 번호를 할당하여'readLines'와 병렬 처리를 할 수 있습니다. –

+0

@PaulHiemstra는 가능한 가장 단순한 경우 어떻게 수행 할 수 있는지 보여줄 수 있습니까? :) –

+0

@AnthonyDamico 저는 지금 당장 시간이 없지만 사소하지는 않다고 생각합니다. 아주 잘 작동하지 않을 수도 있습니다. –

관련 문제