Разархивировать Python - очень медленно?

4

Может кто-нибудь объяснить следующую тайну?

Я создал двоичный файл размером ~ 37 [МБ]. застегивая его в Ubuntu - используя терминал - заняло менее 1 [сек]. Затем я попробовал python: его программное программирование (с использованием zipfile-модуля) заняло около 1 [сек].

Затем я попытался разархивировать созданный zip файл. В Ubuntu - с использованием терминала - это заняло менее 1 [сек].

В python код для распаковки (используется zipfile-модуль) занял около 37 [сек] для запуска! любые идеи, почему?

  • 4
    Не могли бы вы опубликовать часть, куда вы архивируете файлы? Таким образом, мы можем сделать более точные комментарии.
  • 0
    Я предполагаю, что zip / unzip-код на python интерпретируется вместо вызова некоторой (скомпилированной C) библиотеки.
Показать ещё 4 комментария
Теги:
zip
unzip

3 ответа

2

Я пытался распаковывать/распаковывать/извлекать zip файлы с помощью Python, а также "создавать объект ZipFile, прокручивать его .namelist(), читать файлы и записывать их в файловую систему" низкоуровневый подход не кажется очень Python. Поэтому я начал копать объекты zipfile, которые, как я считаю, не очень хорошо документированы и охватывают все методы объекта:

>>> from zipfile import ZipFile
>>> filepath = '/srv/pydocfiles/packages/ebook.zip'
>>> zip = ZipFile(filepath)
>>> dir(zip)
['NameToInfo', '_GetContents', '_RealGetContents', '__del__', '__doc__', '__enter__', '__exit__', '__init__', '__module__', '_allowZip64', '_didModify', '_extract_member', '_filePassed', '_writecheck', 'close', 'comment', 'compression', 'debug', 'extract', 'extractall', 'filelist', 'filename', 'fp', 'getinfo', 'infolist', 'mode', 'namelist', 'open', 'printdir', 'pwd', 'read', 'setpassword', 'start_dir', 'testzip', 'write', 'writestr'] 

Здесь мы переходим к методу "extractall", как tarfile extractall! (на python 2.6 и 2.7, но не 2.5)

Тогда производительность касается; файл ebook.zip 84.6 МБ (в основном pdf файлы), а несжатая папка - 103 МБ, по умолчанию - "Утилита архива" в MacOSx 10.5. Поэтому я сделал то же самое с Python timeit module:

>>> from timeit import Timer
>>> t = Timer("filepath = '/srv/pydocfiles/packages/ebook.zip'; \
...         extract_to = '/tmp/pydocnet/build'; \
...         from zipfile import ZipFile; \
...         ZipFile(filepath).extractall(path=extract_to)")
>>> 
>>> t.timeit(1)
1.8670060634613037

который занял менее 2 секунд на тяжело нагруженной машине, в которой 90% памяти используется другими приложениями.

Надеюсь, это поможет кому-то.

  • 0
    вау, документация по объектам zipfile только что обновилась на docs.python.org через день после того, как я дал этот ответ. возможно, это была какая-то проблема с выходом или Python делает grreeat!
  • 0
    Хорошая информация! Однако, если нам нужно получить доступ только к некоторым файлам или обработать их как-то, а не просто распаковывать их, я боюсь, это не сильно поможет :(
0

Вместо использования модуля python мы можем использовать zip-функцию, предлагаемую ubuntu в python. Я использую это, потому что иногда python zip терпит неудачу.

import os

filename = test
os.system('7z a %s.zip %s'% (filename, filename))
  • 0
    Вы должны использовать str.format() вместо форматирования%, например os.system('7z a {0}.zip {0}'.format(filename)) . Как они упоминают в документах , он будет удален в будущем, и я верю, что он уже вышел в 3+.
  • 3
    @ thegrinner Неправильно. Этого подхода следует вообще избегать, а вместо этого import subprocess; subprocess.call(['7z', 'a', filename+'.zip', filename]) . Или что произойдет, если имя файла содержит пробел или символ новой строки?
0

Я не знаю, какой код вы используете для распаковки вашего файла, но для меня работает следующее: после создания zip-архива "test.zip", содержащего только один файл "file1", следующие выходы Python script file1 "из архива:

from zipfile import ZipFile, ZIP_DEFLATED
zip = ZipFile("test.zip", mode='r', compression=ZIP_DEFLATED, allowZip64=False)
data = zip.read("file1")
print len(data)

Это занимает почти нет времени: я попробовал входной файл на 37 Мбайт, который сжимал до 15-мегабайтного zip-архива. В этом примере Python script занял 0.346 секунд на моем MacBook Pro. Может быть, в вашем случае 37 секунд были заняты тем, что вы сделали с данными?

  • 1
    Прочитать только один файл легко - однако большой zip-архив с большим количеством маленьких сжатых файлов работает для меня крайне медленно. Возможно, поиск файлов внутри zip неэффективен?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню