有沒有辦法緩存python文件句柄?我有一個函數,它將netCDF文件路徑作爲輸入,打開它,從netCDF文件中提取一些數據並關閉它。它被調用了很多次,每次打開文件的開銷都很高。在python中緩存文件句柄到netCDF文件
如何通過緩存文件句柄來加快速度?也許有一個python庫來做到這一點
有沒有辦法緩存python文件句柄?我有一個函數,它將netCDF文件路徑作爲輸入,打開它,從netCDF文件中提取一些數據並關閉它。它被調用了很多次,每次打開文件的開銷都很高。在python中緩存文件句柄到netCDF文件
如何通過緩存文件句柄來加快速度?也許有一個python庫來做到這一點
是的,你可以用下面的Python庫:
讓我們效仿的榜樣。你有兩個文件:
# 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()
這是怎麼回事?
filehandle = None
def get_filehandle(filename):
if filehandle is None or filehandle.closed():
filehandle = open(filename, "r")
return filehandle
您可能需要封裝成一個類是爲了防止其他代碼從與filehandle
變量搞亂。
你能不能讓文件打開,然後發送一個文件對象作爲函數的參數? – kakk11