Назад | Перейти на главную страницу

Скрипт 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 всегда медленнее для этих задач

Я скопировал / вставил ваш код и попробовал оба bz2 и gz против tar cjpf и tar czpf соответственно и обнаружил, что они работают одинаково. Какую версию Python вы используете? Сколько файлов на /home/bob/public_html? Вы пробовали сначала команду tar, а затем свой сценарий или наоборот? (Я предполагаю, что кеш-файлы могут немного исказить результаты, но не настолько).

Я только что взглянул на реализацию 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 может быть более оптимизирован при обработке этого случая. Хотя это всего лишь предположение.