将文件句柄缓存到 python 中的 netCDF 文件
Cache file handle to netCDF files in python
有没有办法缓存 python 文件句柄?我有一个函数,它将 netCDF 文件路径作为输入,打开它,从 netCDF 文件中提取一些数据并关闭它。调用次数多,每次打开文件开销大
我怎样才能通过缓存文件句柄来加快速度?也许有一个 python 库可以做到这一点
这个呢?
filehandle = None
def get_filehandle(filename):
if filehandle is None or filehandle.closed():
filehandle = open(filename, "r")
return filehandle
您可能希望将其封装到 class 中以防止其他代码干扰 filehandle
变量。
是的,您可以使用以下 python 库:
- dill(必填)
- python-memcached(可选)
让我们按照示例进行操作。您有两个文件:
# 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()
有没有办法缓存 python 文件句柄?我有一个函数,它将 netCDF 文件路径作为输入,打开它,从 netCDF 文件中提取一些数据并关闭它。调用次数多,每次打开文件开销大
我怎样才能通过缓存文件句柄来加快速度?也许有一个 python 库可以做到这一点
这个呢?
filehandle = None
def get_filehandle(filename):
if filehandle is None or filehandle.closed():
filehandle = open(filename, "r")
return filehandle
您可能希望将其封装到 class 中以防止其他代码干扰 filehandle
变量。
是的,您可以使用以下 python 库:
- dill(必填)
- python-memcached(可选)
让我们按照示例进行操作。您有两个文件:
# 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()