Python脚本需要很长时间备份文件夹

Python脚本需要很长时间备份文件夹

我从某本书上复制了这个脚本来制作一些文件夹的 tar.bz2 进行备份。

#!/usr/bin/env python
import tarfile, os

def make_tar(folder_to_backup, dest_folder, compression='bz2'):
        if compression:
                dest_ext ='.' + compression
        else:
                dest_ext = ''
        arcname = os.path.basename(folder_to_backup)
        dest_name = '%s.tar%s' % (arcname, dest_ext)
        dest_path = os.path.join(dest_folder, dest_name)
        if compression:
                dest_cmp = ':' + compression
        else:
                dest_cmp = ''

        out = tarfile.TarFile.open(dest_path, 'w' +dest_cmp)
        out.add(folder_to_backup, arcname)
        out.close()
        return dest_path

print "Doing Python"
make_tar('/home/bob/public_html','/home/bob/testbck', compression='bz2')

现在 bash 需要 40 秒来备份该文件夹,而 python 需要大约 8 分钟。

我是不是哪里错了,或者 Python 在这些任务上总是比较慢

答案1

我复制/粘贴了您的代码,并分别尝试了和bz2和,发现它们执行的结果相同。您使用的是哪个版本的 Python?上有多少个文件?您是先尝试 tar 命令,然后尝试脚本,还是反过来?(我猜文件缓存可能会稍微扭曲结果,但不会太严重)。gztar cjpftar czpf/home/bob/public_html

我刚刚看了一下 TarFile 的实现。ipython顺便说一下,使用 很容易:

import tarfile
%edit tarfile.TarFile.add

对于目录来说,情况如下:

    elif tarinfo.isdir():
        self.addfile(tarinfo)
        if recursive:
            for f in os.listdir(name):
                self.add(os.path.join(name, f), os.path.join(arcname, f), recursive, exclude)

我发现随着文件总数的增加,速度会越来越慢。我猜tar在处理这种情况时可能会更加优化。不过,这只是猜测。

相关内容