我经常使用大型数据文件,我需要通过网络访问(主要通过NFS,但有时也通过CIFS)。出于性能原因,最好将这些文件缓存在本地硬盘上,以最大限度地减少网络使用。
所以基本上我正在寻找一个自动处理本地缓存的文件对象,这些内容如下:
import CachedFileObject as cfo
cfo.set_local_cache_dir("/tmp")
handle = cfo.open("/nfs/server1/bigdatafile.nc", "r") # copy file to /tmp, open the copy
# do stuff with the filehandle
del handle # delete the local copy
我真的只需要这个阅读文件。如果应该有一个简单的方法来获得/实现文件创建(甚至写作),那将是一个奖励。
非常感谢任何想法
答案 0 :(得分:2)
我会使用操作系统进行文件缓存。可以将NFS挂载设置为使用-o fsc
进行缓存,并且默认情况下SMB挂载已经启用了一些缓存。
答案 1 :(得分:2)
有一个简单的解决方案(打开完整拷贝以进行读访问,完全拷贝关闭并具有写访问权限):
import os
import shutil
from tempfile import mkstemp
class CachedFileObject(object):
def __init__(self, cache_dir="/tmp"):
self.cache_dir = cache_dir
self.local_file = None
self.local_path = None
self.remote_path = None
self.mode = None
def open(self, path, mode="r", buffering=-1):
if self.local_file and not self.local_file.closed:
raise ValueError("Already open")
fd, self.local_path = mkstemp(dir=self.cache_dir)
os.close(fd)
try:
if "r" in mode and not os.path.exists(path):
raise ValueError("No such remote file")
if os.path.exists(path):
# have remote file
self._cache_remote(path, self.local_path)
self.local_file = open(self.local_path, mode=mode, buffering=buffering)
self.mode = mode
self.remote_path = path
except Exception as e:
os.unlink(self.local_path)
raise
return self
def close(self):
self.local_file.close()
try:
if set("wa+").intersection(set(self.mode)):
# have writes, sync file back to remote side
self._sync_remote(self.remote_path, self.local_path)
finally:
os.unlink(self.local_path)
def _cache_remote(self, remote_path, local_path):
# simple cp
shutil.copy(remote_path, local_path)
def _sync_remote(self, remote_path, local_path):
shutil.copy(local_path, remote_path)
def __getattr__(self, attr):
if self.local_file is not None:
return getattr(self.local_file, attr)
else:
raise ValueError("File is not opened")
创建的对象将作为常规文件行为,并且只在打开/关闭时复制/同步。
用法:
f = CachedFileObject(cache_dir="/your/tmp/dir")
f.open("/path/to/remote/file")
# ..your f.read()'s here..
f.close()