Как использовать 7z DLL для сжатия и добавления множества небольших фрагментов данных в файл

Я хотел бы использовать 7z DLL для добавления небольших объемов данных в один сжатый файл. На данный момент моим лучшим предположением было бы распаковать файл 7z, добавить данные и повторно сжать его. Очевидно, что это не очень хорошее решение с точки зрения производительности, если размер файла 7z становится большим (скажем, 1 ГБ), и я хочу сохранять новый фрагмент каждую секунду. Как я могу сделать это лучше?

Я мог бы использовать любой формат сжатия, поддерживаемый 7z DLL.


person David    schedule 17.05.2011    source источник
comment
@Jakob Bowyer: Пожалуйста, опубликуйте свой ответ как ответ, чтобы мы могли проголосовать за него и правильно его прокомментировать.   -  person S.Lott    schedule 17.05.2011
comment
Это был скорее указатель, чем ответ, но точно.   -  person Jakob Bowyer    schedule 17.05.2011
comment
Должен ли это быть файл 7z или подойдет любое сжатие? В Python также есть встроенная библиотека zipfile, позволяющая делать подобные вещи с ZIP-файлами.   -  person Ben Hoyt    schedule 17.05.2011
comment
Это может быть любой формат сжатия   -  person David    schedule 23.05.2011


Ответы (2)


Взгляните на привязки Python LZMA (LZMA — это название алгоритма сжатия 7z). , вы должны делать то, что хотите, без всего ctypes.

ИЗМЕНИТЬ

Требуется подтверждение, но беглый взгляд на py7zlib.py показывает только поддержку для чтения файлов 7z, а не для записи. Однако в каталоге src есть pylzma_compressfile.c, так что, возможно, что-то нужно сделать.

ИЗМЕНИТЬ 2

Функция pylzma.compressfile, кажется, есть, так что все в порядке.

person CharlesB    schedule 17.05.2011
comment
Итак, как я могу сжать множество небольших фрагментов данных в один файл без повторного сжатия каждый раз всего файла? - person David; 23.05.2011

ЭТО НЕ МОЙ ОТВЕТ.

Как я могу использовать файл DLL из Python?

Я думаю, что ctypes — правильный путь.

Следующий пример ctypes взят из реального кода, который я написал (на Python 2.5). Это был, безусловно, самый простой способ сделать то, что вы просите.

import ctypes

# Load DLL into memory.

hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")

# Set up prototype and parameters for the desired function call.
# HLLAPI

hllApiProto = ctypes.WINFUNCTYPE (ctypes.c_int,ctypes.c_void_p,
    ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p)
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),

# Actually map the call ("HLLAPI(...)") to a Python name.

hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)

# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.

p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))

Материал ctypes содержит все типы данных C-типа (int, char, short, void*,...) и может передаваться по значению или ссылке. Он также может возвращать определенные типы данных, хотя мой пример этого не делает (API HLL возвращает значения, изменяя переменную, переданную по ссылке).

person Jakob Bowyer    schedule 17.05.2011