def dump(self, object, name): ''' store.dump(object, name) Performs the same as pickle.dump(object, file(name,'w')) but does it in a way that is guaranteed to be atomic even over NFS. ''' name = self._getfname(name) create_directories(dirname(name)) self._maybe_create() fd, fname = tempfile.mkstemp('.jugtmp', 'jugtemp', self.tempdir()) output = os.fdopen(fd, 'w') try: import numpy as np if type(object) == np.ndarray: np.lib.format.write_array(output, object) output.close() os.rename(fname, name) return except ImportError: pass except OSError: pass except ValueError: pass encode_to(object, output) output.close() # Rename is atomic even over NFS. os.rename(fname, name)
def dump(self, object, name): ''' store.dump(object, name) Performs roughly the same as pickle.dump(object, open(name,'w')) but does it in a way that is guaranteed to be atomic even over NFS and using compression on the disk for faster access. ''' self._maybe_create() name = self._getfname(name) create_directories(dirname(name)) fd, fname = tempfile.mkstemp('.jugtmp', 'jugtemp', self.tempdir()) output = os.fdopen(fd, 'wb') try: import numpy as np if not self.compress_numpy and type(object) == np.ndarray: np.lib.format.write_array(output, object) output.flush() os.fsync(output.fileno()) output.close() _fsync_dir(fname) os.rename(fname, name) return except ImportError: pass except OSError: pass except ValueError: pass encode_to(object, output) output.flush() os.fsync(output.fileno()) output.close() # Rename is atomic even over NFS. _fsync_dir(fname) os.rename(fname, name)