Python 用于快速重复文件搜索的缓存
我有一个磁盘阵列,其中有几TB组织不良的文件 python程序需要按名称访问文件,每次进行完整搜索非常耗时 我所做的是在文件上构建缓存并搜索缓存 当前代码如下所示:Python 用于快速重复文件搜索的缓存,python,caching,scandir,Python,Caching,Scandir,我有一个磁盘阵列,其中有几TB组织不良的文件 python程序需要按名称访问文件,每次进行完整搜索非常耗时 我所做的是在文件上构建缓存并搜索缓存 当前代码如下所示: pickle_file = 'fscopy.pickle' if os.path.exists(pickle_file): # fscopy = pickle.load(pickle_file) with open(pickle_file, 'r') as infil: fscopy = json.l
pickle_file = 'fscopy.pickle'
if os.path.exists(pickle_file):
# fscopy = pickle.load(pickle_file)
with open(pickle_file, 'r') as infil:
fscopy = json.load(infil)
else:
# extl = {'mp3', 'PDF', 'prc', 'docx', 'txt', 'jpg', 'cue', 'pdf', 'zip', 'iso', 'nfo', 'odt', '7z', 'azw3', 'djvu',
# 'lit', 'Pdf', 'rtf', 'bin', 'wv', 'doc', 'chm', 'RAR', 'epub', 'pdF', 'gz', 'cbz', 'cbr', 'rar', 'mobi',
# ' odt rar', 'ZIP'}
extl = {'.PDF', '.zip', '.7z', '.Pdf', '.wv', '.RAR', '.epub', '.pdF', '.gz', '.rar', '.mobi', '.ZIP'}
fscopy = list()
def walk(r):
for r, dl, fl in os.walk(r):
gfl = list()
for file in fl:
_, e = os.path.splitext(file)
if e in extl:
gfl.append(file)
if len(gfl) > 0:
fscopy.append((r, gfl))
else:
pass
walk('/srv/store')
walk('/srv/private')
# pickle.dump(pickle_file, fscopy)
with open(pickle_file, 'w') as outfil:
json.dump(fscopy, outfil, indent=4)
def ffind(f):
for root, fl in fscopy:
if f in fl:
return os.path.join(root, f)
return None
我想知道是否有更好的方法(或者一些预构建的库)。1您的
ffind
只返回与f
匹配的第一个文件的路径。这是否意味着您的所有文件都有唯一的基名称,或者您总是只想要第一个匹配?2我猜磁盘阵列的内容是稳定的,或者如果您添加或删除任何文件,您不介意重建整个缓存。为什么您要使用json.load()
读取fscopy.pickle
文件(以及json.dump()
写入它)?1您的walk
功能正常,但是,您可以使用新的pathlib
模块更简洁(可能更高效)地完成这项工作。2如果fscopy
是一个字典,使用文件名作为键,则可以使ffind
更快。3我刚刚注意到您实际上没有使用pickle
模块,而是将JSON文件称为pickle文件。这有点令人困惑除了已经提到的问题之外。搜索缓存可以大大改进,因为它现在基本上是一个线性搜索。最好使用字典或集合(或它们的组合)进行更快的查找和其他类型的成员资格测试。1您的ffind
只返回与f
匹配的第一个文件的路径。这是否意味着您的所有文件都有唯一的基名称,或者您总是只想要第一个匹配?2我猜磁盘阵列的内容是稳定的,或者如果您添加或删除任何文件,您不介意重建整个缓存。为什么您要使用json.load()
读取fscopy.pickle
文件(以及json.dump()
写入它)?1您的walk
功能正常,但是,您可以使用新的pathlib
模块更简洁(可能更高效)地完成这项工作。2如果fscopy
是一个字典,使用文件名作为键,则可以使ffind
更快。3我刚刚注意到您实际上没有使用pickle
模块,而是将JSON文件称为pickle文件。这有点令人困惑除了已经提到的问题之外。搜索缓存可以大大改进,因为它现在基本上是一个线性搜索。最好使用字典或集合(或它们的组合)进行更快的查找和其他类型的成员资格测试。