2012-10-02 2 views
5

리눅스 머신에 hdf5 패키지를 성공적으로 설치했습니다. 이제는 많은 수의 hdf5 파일에서 데이터를 루프로 읽고 시간 시리즈를 만들고 싶습니다. 각 hdf5 파일은 다른 시간에 해당합니다. 많은 파일을 읽은 후에 (1000 개가 넘음) R은 너무 많은 파일이 열려 있다고 말합니다. 루프를 계속할 수 있도록 닫는 방법을 찾고 싶습니다. 여기 코드는 다음과 같습니다R로로드 한 후 hdf5 파일을 닫아야합니까?

fdate <- "200605312355" # the first date for my test loop 
    fmax <- 1400 
    arr <- vector() 

    for (i in 1:fmax){ 
     fname <- paste(fdate,"_.h5") # path of h5 file 
     fid <- hdf5load(fname) # fid = NULL 
     arr[i] <- somevariable$data_array[lon,lat] 
     # would like to close the file here 
     fdate <- newdate(fdate,60*5) # a function that increments the date by seconds. 
    } 

HDF5 패키지는 물건을 정리 할 수처럼 보이는 기능 hdf5cleanup를 포함하지만, 파일 식별자가 필요합니다. 위의 코드에서 fid가 NULL을 반환합니다. 대신 hdf5cleanup (fname)과 같이 파일 이름을 삽입하면 R이 중단됩니다. 아마도 hdf5load가 파일을 닫고 실패합니다. 이 경우 system() 명령을 실행하거나 다른 방법으로 연결을 종료 할 수있는 방법이 있습니까?

우연히 showConnections()는 아무 것도 반환하지 않습니다. 글자 그대로 말 그대로 "설명 클래스 모드 텍스트 isopen은 읽을 수 있습니다."입니다.

내 짧은 질문 : hdf5load()로로드 한 후 R의 hdf5 파일에 대한 연결을 어떻게 닫을 수 있습니까?

+0

''R'가 중단되면,'hdf5' 패키지의 관리자에게 연락해야합니다. 관리자는 파일을 닫을 때 올바른 호출을 할 수도 있습니다. –

답변

2

참고 : 의견에 따르면 다음 대답은 작동하지 않습니다. 적어도 지금은 성공하지 못한 경로를 표시하도록 남겨 둡니다.


내가 hdf5가 설치되어 있지 않기 때문에이 작동하는지 내가 확인할 수 없습니다, 그래서 이것은 어둠 속에서 총을 조금이다는 :

fname <- paste(fdate,"_.h5") # path of h5 file 
# fhandle <- open(fname) # Comment pointed out this was not the intended function 
fhandle <- file(description = fname, open = "rb") 
hdf5load(fhandle) # hdf5load returns nothing when load=TRUE (the default) 
arr[i] <- somevariable$data_array[lon,lat] 
close(fhandle) 

문서는 hdf5load 걸리는 것을 말한다 파일 이름이지만 파일 핸들을 사용할 수도 있습니다. 그렇다면이 방법이 효과적 일 수 있습니다.

+0

신속한 답변을 보내 주셔서 감사합니다. open() 함수는 'connection'클래스 용이므로 여기서는 작동하지 않습니다. – user1714900

+0

파일을 열고 close (fhandle)로 닫을 수는 있지만 불행히도'hdf5load (fhandle)'는'fhandle <- file (description = fname, open = "rb" 첫 번째 인수는 경로명이어야합니다'. 자세한 내용은 hdf5load 함수를 참조하십시오. 'function (file, load = TRUE, 자세한 정보 = 0, 정리 = FALSE) { call <- sys.call() .External ("do_hdf5load", call, sys) 프레임 (sys.parent()), 파일, 로드, as.integer (자세한), as.logical (깔끔), 패키지 = "hdf5") }' – user1714900