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

我有一个磁盘阵列,其中有几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.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文件。这有点令人困惑除了已经提到的问题之外。搜索缓存可以大大改进,因为它现在基本上是一个线性搜索。最好使用字典或集合(或它们的组合)进行更快的查找和其他类型的成员资格测试。