在Python中缓存文件句柄到netCDF文件

6

有没有一种方法可以缓存Python文件句柄?我有一个函数,它以netCDF文件路径为输入,打开它,从netCDF文件中提取一些数据,然后关闭它。该函数被频繁调用,每次打开文件的开销很大。

也许有一种Python库可以通过缓存文件句柄来加快速度,你知道如何实现吗?


你不能保持文件处于打开状态,然后将文件对象作为函数参数发送吗? - kakk11
2个回答

3

是的,你可以使用以下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()),所以对象仍然存在于内存中(由于弱引用的原因未被垃圾回收),你可以使用它。即使在不同的进程中也可以。

解决方案

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变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接