2011-08-08 8 views
6

커다란 파일이 있습니다. 여러 개의 I/O 함수를 사용하여 액세스합니다. 가장 일반적인 패키지는 bigmemory 패키지입니다.버퍼가 플러시되었는지 여부를 테스트합니다. R

파일에 쓸 때 출력 버퍼를 비우는 방법을 배웠습니다. 그렇지 않으면 데이터가 저장되었는지 여부에 따라 모든 베팅이 해제됩니다. 그러나 이것은 매우 긴 대기 시간을 초래할 수 있으며 bigmemory은 많은 시간을 필요로합니다. 왜 이런 일이 발생하는지 모르겠습니다. 항상 발생하는 것은 아니며 쉽게 재현되지 않습니다.

I/O 버퍼가 R로 플러시되었는지 여부를 확인하는 방법이 있습니까? 특히 bigmemory일까요? 운영 체제가 중요한 경우 그런 식으로 응답을 제한하십시오.

답변이 bigmemory 이상으로 일반화 될 수 있으면 다른 메모리 매핑 함수 나 I/O 스트림에 의존하기 때문에 그럴 것입니다.

버퍼가 플러시되었는지 여부를 확인하는 좋은 해결책이없는 경우 버퍼가 플러시 된 것으로 간주 할 수있는 경우가 있습니까? 나는. flush()을 사용하는 것 외에.

업데이트 : 나는 이것이 모두 바이너리 연결임을 분명히해야합니다. @RichieCotton은 isIncomplete()을 언급했지만 도움말 문서에는 텍스트 연결 만 언급되어 있습니다. 바이너리 연결에 사용할 수 있는지 여부는 분명하지 않습니다.

+0

'bigmemory'와 함께 사용하는 것은 확실하지 않지만, 'isIncomplete'는 일반 연결에서 작동합니다. –

+0

감사! 연결에 대한 매우 제한된 도움말 정보는 isIncomplete가 텍스트 연결의 출력에 적합하다는 것을 언급합니다. 바이너리 연결에 운이 좋았습니까? – Iterator

답변

0

나는 앞으로 내 자신의 대답을 넣어 것입니다,하지만 난 명확 것을 환영합니다.

지금까지 내가 본 것부터 다양한 연결 기능이 있습니다. file, open, close, flush, isOpenisIncomplete은 (는) 특히 특정 연결 유형에 기반합니다. 파일, 파이프, URL 및 몇 가지 다른 것들.

이와 대조적으로 bigmemory은 자체 연결 유형을 가지고 있으며 bigmemory 객체는 운영 체제 버퍼의 메모리 주소 슬롯이있는 S4 객체입니다. 일단 거기에 놓이게되면, 운영체제는 그 버퍼들을 플러싱하는 역할을 담당하게됩니다. OS 책임이므로 "더러운"버퍼에 대한 정보를 얻으려면 R이 아닌 OS와 상호 작용해야합니다.

따라서 데이터는 커널 버퍼에 저장되기 때문에 bigmemory에 대한 대답은 "아니오"입니다. STDIO를 통해 처리되는 다른 연결 (예 : "사용자 공간")에 대해 "예"일 수 있습니다.

OS/커널 측면에 대한 자세한 내용은 this question on SO; 버퍼 플러싱 호기심을 일으키는 몇 가지 프로그램 (R + bigmemory뿐만 아니라)을 조사 중이며, 그 스레드는 사물의 커널 측면에 대해 나에게 계몽하는 데 도움이되었습니다.

0

바이너리 파일에서 isIncomplete()가 작동하는 것이 더 확실합니까? (도움말 (연결) 파일.에서 수정 된)

# R process 1 
zz <- file("~/test", "wb") 
writeBin(c(1:100000),con=zz) 
close(zz) 

# R process 2 
zz2 <- file("~/test", "rb") 
inpp <- readBin(con=zz2, integer(), 10000) 
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)} 
close(zz2) 

+0

테스트 해 주셔서 감사합니다. 그러나, 내가 잘못 이해하지 않으면, 귀하의 예제는 입력 버퍼의 경우에만 그것을 사용합니다.출력 버퍼에서 작동하는지는 분명하지 않습니다. 필자는 같은 방식으로 테스트 할 수 있는지 여부를 결정하기 위해 출력 버퍼링에 익숙하지 않습니다. 나는 문서를 넘어서기를 꺼려합니다. 행동이 결정 론적 이라기보다는 무작위 인 경우 손상된 데이터가 위험합니다. 나는 그 길을 걸어 왔으므로 신중하다. :) – Iterator

+0

추가 테스트 후에,'isIncomplete()'가'bigmemory' 오브젝트에 대해 작동하지 않는다고 생각합니다. 오브젝트가 연결이 아닌 일종의 포인터 인 것 같습니다. : – Iterator

+0

제안과 예제를 보내 주셔서 감사합니다.이 경우 버퍼는 R 외부에서 처리됩니다. – Iterator