我正在使用klepot归档来索引文件夹树中的文件规格。扫描完树之后,我想快速删除对已删除文件的引用。但是简单地从文件归档中逐个删除一个条目是非常慢的。 有没有办法将更改同步到存档,或者一次删除多个密钥?(“sync”方法仅用于添加新项目)
@Mike Mckerns对这个问题的有用回答只涉及删除一个项目: Python Saving and Editing with Klepto
使用文件.sync()或文件.dump()仅用于从缓存中追加数据,而不用于同步删除。有没有办法从缓存中删除密钥,然后一次同步这些更改。单个删除太慢。你知道吗
下面是一个工作示例:
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()
我明白了。。。您真正关心的是从
file_archive
中一次删除一个条目的速度。你知道吗好吧,我同意。在
file_archive
上使用__delitem__
或pop
有点残忍,因为您需要删除多个条目。减速是由于file_archive
必须为删除的每个键加载并重写整个文件存档。这不是dir_archive
或其他许多档案的情况。。。但对于一个file_archive
来说,它是。所以这应该得到补救。。。你知道吗更新:我添加了一个新方法,可以更快地删除指定的键。。。你知道吗
以前(即在发布的版本中),您可以廉价地
pop
从本地缓存中删除所需的密钥,然后执行ar.sync(clear=True)
以删除存档中的关联密钥。但是,这样做的前提是您拥有要保存在内存中的所有密钥。因此,您现在可以(至少在即将发布的版本中)在缓存和/或存档中执行popkeys
操作来删除其中任何不需要的密钥,而不是将所有密钥加载到内存中。你知道吗相关问题 更多 >
编程相关推荐