2011-04-25 2 views
13

multicore 패키지와 큰 개체로 계속 문제가 발생합니다. 기본 개념은 대형 객체를 읽으려면 Bioconductor 함수 (readBamGappedAlignments)를 사용하고 있다는 것입니다. 나는 파일 이름의 문자 벡터를 가지고 있으며, 파일을 반복하고 목록으로 읽어 들이기 위해 mclapply을 사용 해왔다. 이 기능은 다음과 같은 :큰 개체가있는 mclapply - "직렬화가 너무 커서 원본 벡터에 저장할 수 없습니다."

objects <- mclapply(files, function(x) { 
    on.exit(message(sprintf("Completed: %s", x))) 
    message(sprintf("Started: '%s'", x)) 
    readBamGappedAlignments(x) 
}, mc.cores=10) 

을하지만, 나는 다음과 같은 오류가 계속 : Error: serialization is too large to store in a raw vector. 그러나,이 오류없이 혼자서 같은 파일을 읽을 수있는 것 같습니다. 이 문제에 대한 설명이 해결되지 않은 한 here입니다.

모든 병렬 솔루션 제안을 환영합니다. 이는 병렬로 수행해야합니다. 나는 눈을 볼 수 있었지만, 15 개의 프로세서, 8 개의 코어, 256GB의 메모리를 가진 매우 강력한 서버를 가지고 있습니다. 우리 클러스터 중 하나를 사용하는 대신 코어를 통해이 머신에서 수행합니다.

+2

한 컴퓨터에서 눈이 내리는 소켓 클러스터를 사용할 수 있습니다 (기본값은 'localhost'입니다). –

+10

부모가 자식에서 데이터를 검색하려고 할 때 데이터가 원시 형식의 벡터로 변환되고 벡터의 길이가 가장 긴 벡터 2^31 - 1보다 길기 때문에 오류가 발생합니다. 함수를 더 많이 움직여보십시오. 결과는 큰 데이터의 '감소'입니다. –

+0

감사합니다 톤 마틴! 나는이 문제와 관련이있을 수 있다고 생각했지만 다른 오류 메시지가 나타날 것이라고 생각했다. 'R_len_t'를 사용하지 않으면 다시 못생긴 머리가됩니다. 우리가 이것을 길게 설정하고 끝내면 좋을 것입니다. – Vince

답변

3

정수 제한은 multicore 패키지에 통과 의지를 sendMaster 같은 (최대 정수 약) 20 억에서 세포와 데이터 세트, 낮은 수준의 기능을 차단할 수 제한 내 경험에 R. 빠른 시일 내에 해결해야 소문이 원시 벡터. 데이터 테이블 형식으로 약 4 억 행의 데이터와 8 억 개의 셀을 나타내는 약 1 백만 개의 프로세스가 있었으며 mclapply가 결과를 보내면 다시이 한계에 도달했습니다.

분할 및 정복 전략은 그리 어렵지 않고 작동합니다. 이것은 해킹이며 mclapply에 의존 할 수 있어야한다는 것을 알고 있습니다.

하나의 큰 목록 대신 목록 목록을 만드십시오. 각 하위 목록은 깨진 버전보다 작으므로 분할하여 mclapply로 분할합니다. 이것을 file_map이라고 부르십시오. 결과는 목록의 목록이므로 특별한 이중 연결 do.call 기능을 사용할 수 있습니다. 결과적으로 mclapply가 완료 될 때마다 직렬화 된 원시 벡터의 크기는 관리 가능한 크기입니다. 작은 조각 이상

그냥 루프 : 당신은 SQLite는 등의 이동으로

collector = vector("list", length(file_map)) # more complex than normal for speed 

for(index in 1:length(file_map)) { 
reduced_set <- mclapply(file_map[[index]], function(x) { 
     on.exit(message(sprintf("Completed: %s", x))) 
     message(sprintf("Started: '%s'", x)) 
     readBamGappedAlignments(x) 
    }, mc.cores=10) 
collector[[index]]= reduced_set 

} 

output = do.call("c",do.call('c', collector)) # double concatenate of the list of lists 

다른 방법으로는, 데이터베이스에 출력을 저장합니다.

관련 문제