Сжатие/распаковка без временных файлов

1. oyti 55 07.12.18 10:57 Сейчас в теме
Здравствуйте.

Сценарий: получаем через веб данные из одной системы, распаковываем, обрабатываем, запаковываем, отправляем результат в другую систему.
Интересует, каким образом можно организовать сжатие/распаковку данных средствами 1С без использования временных файлов. Пока не нашел ничего лучше ЗаписьZipФайла/ЧтениеZIPФайла. Данный вариант плохо масштабируется, а при росте объема данных так и вовсе будет жутко медленным (вопросов по оптимизации и так хватает).

Буду рад, если кто-нибудь из коллег поправит и покажет юному падавану, как работают с компрессией истинные джедаи.

Спасибо.
triviumfan; +1 Ответить
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
3. razor2k 07.12.18 14:15 Сейчас в теме +1 $m
Вы можете установить в системе RAM-диск. Это такая программа, которая отрезает часть оперативной памяти и превращает ее в дисковое устройство (причем очень быстрое). Размер диска выбираете в зависимости от объема файлов, которые будете распаковывать и доступного объема оперативной памяти. Выбрать программу RAM-диска можно из следующего обзора
После установки и настройки программы у вас появится в системе быстрый диск (например T) к которому вы можете обращаться стандартными средствами из 1С.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Timur.V 78 07.12.18 11:56 Сейчас в теме
Процедура ОбработкаФайлаНаСервере(АдресВХ)
 	БинДанные = ПолучитьИзВременногоХранилища(АдресВХ);
 	Если БинДанные <> Неопределено Тогда  	
      	ПолучитьФайлыАрхива(БинДанные);
 	КонецЕсли;
КонецПроцедуры
 
Функция ПолучитьФайлыАрхива(БинДанные)
 	Результат = Новый Массив();
 	
 	ЧтениеZipФайла = Новый ЧтениеZipФайла(БинДанные.ОткрытьПотокДляЧтения());
 	ЧтениеZipФайла.ИзвлечьВсе("Путь к каталогу", РежимВосстановленияПутейФайловZIP.Восстанавливать);
 	ЧтениеZipФайла.Закрыть();    
КонецФункции
Показать

В данном примере все же происходит запись на диск (разархивация), но будем надеяться,
когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.
-----------------------------------------------------1
После того, как архив успешно открыт, можно получить информацию о файлах, хранящихся внутри него. Для этого у объекта ЧтениеZIPФайла предусмотрено свойство Элементы, которое предоставляет доступ к коллекции элементов ZIP файла.

Для каждого элемента можно получить разнообразную информацию о его имени, времени его модификации, его атрибутах, а также узнать является ли данный элемент зашифрованным.

После получения информации о элементах их можно распаковать на диск. Это возможно сделать двумя методами:

Воспользоваться методом ИзвлечьВсе().
Воспользоваться методом Извлечь().
Метод ИзвлечьВсе() распаковывает все файлы в архиву по указанному пути. Второй параметр данного метода определяет возможность восстановления исходных путей файлов.

Метод Извлечь() распаковывает указанный элемент коллекции из свойства Элементы по указанному пути. Второй параметр данного метода аналогичен тому же параметру метода ИзвлечьВсе().

После того, как архив нам больше не нужен можно завершить работу с ним вызвав метод Закрыть().
-------------------------------------------------1
Основу для работы с двоичными данными составляет группа новых типов, которую можно обозначить словом «потоки».
Таких типов три: Поток, ФайловыйПоток и ПотокВПамяти. В примере используется один из них, ФайловыйПоток, но остальные работают, по большому счёту, аналогично.

Потоки предназначены для последовательного чтения/записи больших объемов двоичных данных. Их преимущество заключается в том, что они позволяют работать с потоками данных произвольного объёма. Но вместе с этим они предоставляют лишь базовые возможности работы, такие как чтение из потока, запись в поток и изменение текущей позиции.

Потоки можно сконструировать по имени файла или из объекта ДвоичныеДанные. В примере поток конструируется по имени файла (ФайловыеПотоки.ОткрытьДляЧтения(ИмяФайла)) одним из методов объекта МенеджерФайловыхПотоков. ссылка
--------------------------------------------------1
Если придется писать на диск, тогда увеличивайте скорость чтения/записи диска (sas, ssd, raid).


Или попробуйте решить вашу задачу не средствами 1С.
primat; dvsidelnikov; triviumfan; +3 Ответить
3. razor2k 07.12.18 14:15 Сейчас в теме +1 $m
Вы можете установить в системе RAM-диск. Это такая программа, которая отрезает часть оперативной памяти и превращает ее в дисковое устройство (причем очень быстрое). Размер диска выбираете в зависимости от объема файлов, которые будете распаковывать и доступного объема оперативной памяти. Выбрать программу RAM-диска можно из следующего обзора
После установки и настройки программы у вас появится в системе быстрый диск (например T) к которому вы можете обращаться стандартными средствами из 1С.
5. oyti 55 11.12.18 17:41 Сейчас в теме
(3) Спасибо. С практической точки зрения вполне себе вариант с наименьшими затратами.
7. -AI- 04.10.19 06:54 Сейчас в теме
(3) добавлю свои 5 копеек про рам диск... (я как то задался целью найти аналог tmpfs из мира *nix, но под винду)

10 лет назад, работая сисадмином, задался вопросом убыстрения некоторых процессов с 1С, которые создают много временных файлов (точно не помню, но вроде это было обновление, вот тестировал точно на обновлении, т.к. удобно было откатиться, и проделать тест повторно)

так вот, изучая этот вопрос и делая замеры тестов, я понял, что всё "украдено до нас" сделано за нас.

В винде, (а если я правильно помню, ещё в ДОС через 21h прерывание, функция 5Ah) есть возможность создать т.н. "временный файл".

так вот, в винде это работает так: (2003/XP+ точно, а возможно даже и в DOS5.0+ с появлением SmartDrive, но это не точно):
Если временный файл удалили ДО сброса его из кеша на диск, то он никогда не будет записан на диск.

PS я тогда делал замеры, и получалось, что есть папочку Temp перенести в RAMDisk, то время работы обновления было таким же или даже дольше.
- таким же - это потому что временные файлы не были записаны на диск, и время на это не тратилось, т.е. получался как бы RAMDisk (точнее tmpfs, т.к. файлы в памяти занимали ровно столько места какого размера они были)
- с RAMDisk получалось иногда медленнее, т.к. RAMDisk занимал место в памяти (намного больше чем все файлы там хранящиеся) оставляя меньше места под кеш, и винде иногда приходилось повторно читать то что без RAMDisk уже было в кеше.

PPS ссылка где топикстартер - это я, к сожалению ссылки на которые я там ссылаюсь стухли, но смысл того что там было, вроде понятен...
4. vipetrov2 10.12.18 12:23 Сейчас в теме
Есть такая вещь pipe (именованный канал) https://ru.wikipedia.org/wiki/Именованный_канал . Это по сути файл в памяти, к нему можно обращаться по пути «\\.\pipe\».
У unzip есть стандартный ключ "-p Extract files to pipe (stdout)." "-p Извлечь файлы в канал (стандартный поток вывода – stdout)."
Я бегло так и не понял, что за unzip, но похоже это стандарт, а реализаций может быть много. Можно unzip использовать этот http://gnuwin32.sourceforge.net/packages/unzip.htm
6. dvsidelnikov 48 24.09.19 22:47 Сейчас в теме
Если я правильно понял проблему, то вот:


	БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные);
	ЧтениеZipФайла =Новый ЧтениеZipФайла(Новый ПотокВПамяти(БуферДвоичныхДанных));
user1353054; Xershi; eufes; +3 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот