title: How to delete multiple items from Klepto file archive fast?
body: <p>I'm using Klepto archive to index specs of files in a folder tree. After scanning the tree, I want to quickly remove references to deleted files. But simply removing an item one-by-one from the file archive is extremely slow.
  Is there a way to sync the changes to the archive, or delete multiple keys at once? (The 'sync' method only appears to add new items)</p>
  
  <p>The helpful answer by @Mike Mckerns to this question only deals with removing a single item:
  <a href="https://stackoverflow.com/questions/29270772/python-saving-and-editing-with-klepto/29291153">Python Saving and Editing with Klepto</a></p>
  
  <p>Using files.sync() or files.dump() appears only to append data from the cache, not sync the deletes. Is there a way to delete keys from the cache and then sync those changes all-at-once. Individual deletes are far too slow.</p>
  
  <p>Here's a working example:</p>
  
  <pre><code>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()
  </code></pre>