首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速删除Klepto文件存档中的多个项目?

如何快速删除Klepto文件存档中的多个项目?
EN

Stack Overflow用户
提问于 2019-02-13 22:49:00
回答 1查看 172关注 0票数 1

我正在使用Klepto归档文件索引文件规格在文件夹树中。扫描树后,我希望快速删除对已删除文件的引用。但是简单地从文件归档中逐个删除一个项目是非常慢的。是否有方法同步对归档的更改,或一次删除多个键?(“sync”方法只显示添加新项)

@ Mckerns对此问题的有益回答仅涉及删除一个项目:Python Saving and Editing with Klepto

使用files.sync()或files.dump()只会从缓存中追加数据,而不是同步删除。是否有方法从缓存中删除键,然后立即同步这些更改。单个删除操作太慢了。

下面是一个有用的例子:

代码语言:javascript
复制
from klepto.archives import *
import os

class PathIndex:
    def __init__(self,folder):
        self.folder_path=folder
        self.files=file_archive(self.folder_path+'/.filespecs',cache=False)
        self.files.load() #load memory cache

    def list_directory(self):
        self.filelist=[]
        for folder, subdirs, filelist in os.walk(self.folder_path): #go through every subfolder in a folder
            for filename in filelist: #now through every file in the folder/subfolder
                self.filelist.append(os.path.join(folder, filename))

    def scan(self):
        self.list_directory()
        for path in self.filelist:
            self.update_record(path)
        self.files.dump() #save to file archive

    def rescan(self):
        self.list_directory() #rescan original disk
        deletedfiles=[]

        #code to ck for modified files etc            
        #check for deleted files
        for path in self.files:
            try:
                self.filelist.remove(path)  #self.filelist - disk files - leaving list of new files
            except ValueError:
                deletedfiles.append(path)

        #code to add new files, the files left in self.filelist
        for path in deletedfiles:
            self.delete_record(path)
        #looking to here sync modified index from modifed to disk

    def update_record(self,path):
        self.files[path]={'size':os.path.getsize(path),'modified':os.path.getmtime(path)}
        #add other specs - hash of contents etc.

    def delete_record(self,path):
        del(self.files[path]) #delete from the memory cache
        #this next line slows it all down
        del(self.files.archive[path]) #delete from the disk cache

#usage
_index=PathIndex('/path/to/root')
_index.scan()
#delete, modify some files
_index.rescan()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-14 22:31:32

我明白了。您真正关心的是从一个中删除一个条目的速度。

好吧我同意。当您想要删除几个条目时,在__delitem__pop上使用file_archive有点残忍。这是由于file_archive必须为您删除的每个键加载和重写整个文件存档。这不是dir_archive或其他许多档案的情况.但是对于一个file_archive来说,它是。所以应该补救一下..。

更新:我添加了一种新方法,可以更快地删除指定的键.

代码语言:javascript
复制
>>> import klepto as kl
>>> ar = kl.archives.file_archive('foo.pkl')
>>> ar['a'] = 1
>>> ar['b'] = 2
>>> ar['c'] = 3
>>> ar['d'] = 4
>>> ar['e'] = 5
>>> ar.dump()
>>> ar.popkeys(list('abx'), None)
[1, 2, None]
>>> ar.sync(clear=True)
>>> ar
file_archive('foo.pkl', {'c': 3, 'e': 5, 'd': 4}, cached=True)
>>> ar.archive
file_archive('foo.pkl', {'c': 3, 'e': 5, 'd': 4}, cached=False)

以前(即在发布的版本中),您可以廉价地从本地缓存中pop您想要的键,然后执行一个ar.sync(clear=True)来删除存档中的相关键。但是,这样做假定您拥有所有希望保留在内存中的键。因此,您现在可以(至少在即将发布的版本中)在缓存和/或存档中执行popkeys来删除任何一个不需要的键,而不是将所有密钥加载到内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54680648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档