2016-09-05 2 views
0

이것은 XML 데이터로 작업 한 첫 번째 시간이며 제공 할 수있는 모든 도움/조언에 감사드립니다!R을 사용하여 S3에서 XML 데이터를 더 빨리 읽는 방법?

AWS에 저장된 일부 데이터를 XML 파일 모음으로 가져 오려고합니다. XML 파일이 호스팅되는 ~ 200,000 개의 URL 목록이 포함 된 색인 파일이 있습니다. 현재 R의 XML 패키지를 사용하여 각 URL을 반복하고 관심있는 노드의 데이터를 가져옵니다.이 작업은 정상적으로 작동하지만 너무 많은 URL을 사용하면이 루프를 완료하는 데 약 12 ​​시간이 걸립니다.

다음은 간단한 코드입니다. index 파일에는 URL 목록이 들어 있습니다. 파싱 ​​된 XML 파일은 그다지 크지 않습니다 (이 예제에서 dat ... R은 432 바이트라고 알려줍니다). NodeOfInterest을 데이터를 가져 오려는 XML 태그를 나열하는 지점의 자리 표시 자로 넣었습니다.

for (i in 1:200000) { 
    url <- paste('http://s3.amazonaws.com/',index[i,9],'_public.xml', sep="") ## create URL based off of index file 
    dat <- (xmlTreeParse(url, useInternal = TRUE)) ## load entire XML file 
    nodes <- (getNodeSet(dat, "//x:NodeOfInterest", "x")) ##find node for the tag I'm interested in 

    if (length(nodes) > 0 & exists("dat")) { 
     dat2 <- xmlToDataFrame(nodes) ##create data table from node 
     compiled_data <- rbind(compiled_data, dat2) ##create master file 
     rm(dat2) 
     } 
    print(i) 
} 

이 데이터를 가져 오는 더 효율적인 방법이있는 것처럼 보입니다. 가장 긴 단계 (지금까지) XML을 메모리에로드하고 있다고 생각하지만 다른 옵션을 제안하는 내용은 찾지 못했습니다. 어떤 충고???

미리 감사드립니다.

+3

코드를 벤치마킹했거나 프로파일 링 한 적이 있습니까? 즉 R이 대부분의 시간을 보내는 곳을 보았습니까? 'compiled_data '를위한 공간이 미리 할당되어 있습니까? 냅킨 계산의 뒤에서는 0.216 초/파일 (인터넷 대기 시간, XML 구문 분석 및 rbind 결과)이 필요하다고 말합니다. 하나의 옵션은 R의 병렬 패키지 중 하나를 사용하여 목록을 나누고 정복하는 것입니다. 또 다른 방법은 파싱이 끝날 때까지'xmlToDataFrame'과'rbind'를 저장하는 것입니다. 다른 하나는 RAW XML에서'readLines'를 수행 한 다음 다른 모든 처리를 로컬에서/읽은 후에 (잠재적으로 병렬로) 수행하는 것입니다. – hrbrmstr

답변

0

xmlTreeParse의 pinchpoint에 XML을 구문 분석하는 경우 SAX과 같은 스트리밍 인터페이스를 사용하면 응용 프로그램에 유용한 요소 만 처리 할 수 ​​있습니다. 필자는 사용하지 않았지만 패키지 xml2은 SAX 기능을 제공하는 libxml2 위에 구축되었습니다.

관련 문제