Как использовать 7z DLL для сжатия и добавления большого количества маленьких кусочков данных в файл - PullRequest
1 голос
/ 17 мая 2011

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

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

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

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

EDIT

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

РЕДАКТИРОВАТЬ 2

Кажется, здесь есть функция pylzma.compressfile, так что отлично.

0 голосов
/ 17 мая 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 *, ...) и может передаваться по значению или ссылке. Он также может возвращать определенные типы данных, хотя мой пример этого не делает (HLL API возвращает значения путем изменения переменной, переданной по ссылке).

...