2016-09-29 3 views
6

파이썬 파일 핸들을 캐시 할 수있는 방법이 있습니까? NetCDF 파일 경로를 입력으로 받아서 열어 netCDF 파일에서 일부 데이터를 추출하고 닫는 기능이 있습니다. 그것은 많은 시간을 불러오고 매번 파일을 여는 오버 헤드가 높습니다.파이썬에서 netCDF 파일에 대한 캐시 파일 핸들

어쩌면 파일 핸들을 캐싱하여 더 빨리 만들 수 있습니까? 아마도 이것을 수행 할 파이썬 라이브러리가있을 것입니다.

+0

당신은 열려있는 파일을 유지하고 함수의 인수로 파일 객체를 보낼 수 있습니까? – kakk11

답변

3

예, 사용할 수 있습니다

는의가 모범을 따라 보자. 이제 실행하면

# save.py - it puts deserialized file handler object to memcached 
import dill 
import memcache    


mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
file_handler = open('data.txt', 'r') 
mc.set("file_handler", dill.dumps(file_handler)) 
print 'saved!' 

# read_from_file.py - it gets deserialized file handler object from memcached, 
#      then serializes it and read lines from it 
import dill 
import memcache 


mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
file_handler = dill.loads(mc.get("file_handler")) 
print file_handler.readlines() 

:

python save.py 
python read_from_file.py 

당신은 당신이 원하는 것을 얻을 수있는 두 가지 파일이 있습니다.

왜 작동합니까?

파일 (file_handler.close())을 닫지 않았으므로 개체가 아직 메모리에 있습니다 (weakref 때문에 가비지 수집되지 않았 음).이 파일을 사용할 수 있습니다. 다른 과정에서도.

솔루션

import dill 
import memcache 


mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
serialized = mc.get("file_handler") 
if serialized: 
    file_handler = dill.loads(serialized) 
else: 
    file_handler = open('data.txt', 'r') 
    mc.set("file_handler", dill.dumps(file_handler)) 
print file_handler.readlines() 
-1

이 부분에 대해 어떻게 생각하십니까?

filehandle = None 
def get_filehandle(filename): 
    if filehandle is None or filehandle.closed(): 
     filehandle = open(filename, "r") 
    return filehandle 

당신은 filehandle 변수 덤비는에서 다른 코드를 방지하기 위해 클래스에이를 캡슐화 할 수 있습니다. 파이썬 라이브러리 다음