Python 如何快速从Klepto文件归档中删除多个项目?
我正在使用Klepto archive为文件夹树中的文件规范编制索引。扫描完树后,我想快速删除对已删除文件的引用。但是,简单地从文件归档中逐个删除一个项目是极其缓慢的。 是否有方法将更改同步到存档,或一次删除多个密钥?(同步方法仅用于添加新项目) @Mike Mckerns对此问题的有用回答仅涉及删除单个项目: 使用files.sync()或files.dump()只会从缓存中追加数据,而不会同步删除。有没有办法从缓存中删除密钥,然后一次性同步这些更改。单个删除太慢了 下面是一个工作示例:Python 如何快速从Klepto文件归档中删除多个项目?,python,klepto,Python,Klepto,我正在使用Klepto archive为文件夹树中的文件规范编制索引。扫描完树后,我想快速删除对已删除文件的引用。但是,简单地从文件归档中逐个删除一个项目是极其缓慢的。 是否有方法将更改同步到存档,或一次删除多个密钥?(同步方法仅用于添加新项目) @Mike Mckerns对此问题的有用回答仅涉及删除单个项目: 使用files.sync()或files.dump()只会从缓存中追加数据,而不会同步删除。有没有办法从缓存中删除密钥,然后一次性同步这些更改。单个删除太慢了 下面是一个工作示例: f
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()
我明白了。。。您真正关心的是一次从
文件中删除一个条目的速度
好的,我同意。当您要删除多个条目时,在文件\u存档
上使用\uuuu delitem\uuuu
或pop
有点残忍。速度减慢是由于文件\u存档
必须为您删除的每个密钥加载并重写整个文件存档。对于dir\u存档
或许多其他存档,情况并非如此。。。但是对于文件\u归档
来说,它是。所以这应该得到补救
更新:我添加了一个新方法,可以更快地删除指定的键
>>> 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)
以前(即在发布版本中),您可以从本地缓存廉价地弹出所需的密钥,然后执行ar.sync(clear=True)
以删除存档中的相关密钥。但是,这样做假设您拥有要保存在内存中的所有密钥。因此,您现在可以(至少在即将发布的版本中)在缓存和/或存档中执行popkeys
,而不是将所有密钥加载到内存中,以删除其中任何不需要的密钥。我明白了。。。您真正关心的是一次从文件中删除一个条目的速度
好的,我同意。当您要删除多个条目时,在文件\u存档
上使用\uuuu delitem\uuuu
或pop
有点残忍。速度减慢是由于文件\u存档
必须为您删除的每个密钥加载并重写整个文件存档。对于dir\u存档
或许多其他存档,情况并非如此。。。但是对于文件\u归档
来说,它是。所以这应该得到补救
更新:我添加了一个新方法,可以更快地删除指定的键
>>> 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)
以前(即在发布版本中),您可以从本地缓存廉价地弹出所需的密钥,然后执行ar.sync(clear=True)
以删除存档中的相关密钥。但是,这样做假设您拥有要保存在内存中的所有密钥。因此,您现在可以(至少在即将发布的版本中)在缓存和/或存档中执行popkeys
操作,而不是将所有密钥加载到内存中,以删除其中任何一个中不需要的密钥。我不确定我是否理解您想要什么。是否要使用一种方法从缓存中删除多个密钥,然后同步存档中所有已删除的密钥(以便删除关联的文件条目)?我相信您可以使用清除
和加载
,或者清除
和转储
,或者同步(clear=True)
。。。这取决于你想做什么。如果你提供一个最小的自包含示例,我可以提供一个更清晰的答案——用一个示例。非常感谢——用文件索引器的简化版本更新。完整版本添加了更多规范,还处理修改的文件和新文件。为了避免大目录的内存问题,在初始扫描时,会将文件转储为块存档。我不确定我是否理解您的要求。是否要使用一种方法从缓存中删除多个密钥,然后同步存档中所有已删除的密钥(以便删除关联的文件条目)?我相信您可以使用清除
和加载
,或者清除
和转储
,或者同步(clear=True)
。。。这取决于你想做什么。如果你提供一个最小的自包含示例,我可以提供一个更清晰的答案——用一个示例。非常感谢——用文件索引器的简化版本更新。完整版本添加了更多规范,还处理修改的文件和新文件。为了避免巨大目录的内存问题,在初始扫描时,会将文件转储成块存档;速度是关键。我会照你的建议做的。太好了——应该可以了,谢谢。在上面的例子中,假设您在存档中使用了ar.popkeys(),那么ar.sync(clear=True)下面的行就不再需要了。正确。关键是,sync
是一个不同于从缓存和归档中删除密钥的用例;速度是关键。我会照你的建议做的。太好了——应该可以了,谢谢。在上面的例子中,假设您在存档中使用了ar.popkeys(),那么ar.sync(clear=True)下面的行就不再需要了。正确。关键是,sync
与从缓存和存档中删除密钥不同。