Внешняя компонента 1С для потокового сжатия и распаковки gzip/deflate (Windows/Linux)
Внешняя компонента 1С для сжатия и распаковки данных в формате gzip/zlib/deflate. Использует библиотеку zlib. Отличие от существующих решений: 1) обработка данных в потоковом режиме, 2) поддержка всех серверных архитектур 1С, как Windows, так и Linux. Реализована по технологии Native API на C++. Доступен исходный код.
- Описание
- Подробнее
Описание
Итак, пришло время вернуться к теме «Yet another unpack»))). А точнее, к теме обработки данных в формате gzip/zlib/deflate. За свою практику мне пришлось всего дважды столкнуться с необходимостью обработки данных, сжатых алгоритмом Deflate. Первый раз случился несколько лет назад, и я тогда воспользовался внешней компонентой, опубликованной здесь, на Инфостарте (//infostart.ru/1c/tools/487987/). Спасибо автору, но, к сожалению, в то время его компонента работала только на 32-разрядной платформе Windows, и пришлось вскоре от нее отказаться, т.к. 32-разрядный сервер 1С нынче мало где встретишь. (Признаюсь, я тогда докатился до того, что написал свою реализацию алгоритма распаковки на языке 1С, работало правильно, но дико медленно, всё-таки 1С – язык не для подобных задач). Второй раз случился недавно, и я решил закрыть этот гештальт окончательно.
Задача имеет следующий вид: на вход поступают данные в формате XML, сжатые в GZIP (ещё и закодированные поверх в Base64, но это пока опустим). Данные имеют табличную форму и их требуется загрузить в таблицу БД (в справочник, в регистр сведений – не суть). Объем данных в поступающем файле довольно большой, и может исчисляться мегабайтами даже в сжатом виде (на самом деле, данные мне приходят не из файла, а из ответа веб-сервиса, но, опять же, не суть).
XML имеет низкую информационную плотность, и прекрасно жмётся более, чем в 10 раз. Будучи распакованным в памяти целиком, он может превратиться в «бомбу» размером в сотню мегабайт, что нанесет ощутимый удар по ресурсам памяти сервера. Конечно, можно было бы выполнить распаковку из файла в файл, а потом уже читать распакованный XML из файла в потоковом режиме, но перекачивать десятки мегабайт через дисковую память – не очень красивое решение с точки зрения производительности, да и вообще. Хотелось бы реализовать прямую распаковку в памяти, но в потоковом режиме, т. е. блоками разумного размера, чтобы объем используемой памяти не зависел от общего объема входных данных.
Решение должно работать на любых серверных архитектурах платформы 1С. Неизвестно, какой сервер будет использовать наш заказчик, он может оказаться как на Windows, так и на Linux.
Отсюда следуют два ключевых требования к внешней компоненте:
Обработка данных в потоковом режиме.
Поддержка всех серверных архитектур 1С: как Windows, так и Linux.
В нашем распоряжении есть популярная библиотека zlib (авторы Jean-loup Gailly и Mark Adler, https://www.zlib.net/). Написана на C, поставляется в виде исходных текстов и может быть собрана под любую целевую архитектуру. Собственно, на этой библиотеке и построен архиватор gzip.
Базовые функции zlib ориентированы как раз на потоковую обработку (сжатие и распаковку) данных блоками произвольного размера: именно то, что нам нужно. Все функции этой библиотеки для работы с gzip-файлами являются уже вторичной надстройкой над базовыми потоковыми функциями.

