Вход | Регистрация

  1  2

Как хотя бы грубо определить размер будущего файла из ЗаписьXML?

Как хотя бы грубо определить размер будущего файла из ЗаписьXML?
Я
   TormozIT
 
01.10.09 - 12:48
сабж
 
 
   Живой Ископаемый
101 - 02.10.09 - 14:09
2(100) В общем смотри, у меня была идея вывести эмперически закономерность между размером того что получается при СохранитьЗначениеВФайл() для объекта и того, сколько он занимает в ХМЛ... Но нет времени даже накидать какой-то черновик.. Так что прими идею пока на уровне бреда... Вдруг он мспособна вызреть во что-то?
   Serg_1960
 
102 - 02.10.09 - 14:15
Дабы вновь не быть голословным - пример записи в два потока. Один - временный, только для получения размера, другой - пачка файлов обмена: Условие автора выполнено: пусть с тормозами, но за один проход?

Процедура КнопкаВыполнитьНажатие(Кнопка)    
 
   
   
   // болванка для организации примера работы
   ЗаписьXML = Новый ЗаписьXML;
   ИмяФайла        = \"D:\Temp\Выгрузка_Пачка_\";
   Пачка            = 0;
   Объектов        = 0;
   ТекРазмер        = 0;
   МаксРазмер        = 5000000; //по 5 метров
   ФайлОткрыт        = Ложь;
   ИмяТемпФайла    = ПолучитьИмяВременногоФайла();
   FSO                = Новый COMОбъект(\"Scripting.FileSystemObject\");
   
   // Будем издеваться над заказами покупателей за текущий год
   Запрос = Новый Запрос(\"ВЫБРАТЬ
                         |    ЗаказПокупателя.Ссылка
                         |ИЗ
                         |    Документ.ЗаказПокупателя КАК ЗаказПокупателя
                         |ГДЕ
                         |    ЗаказПокупателя.Проведен = ИСТИНА
                         |    И ГОД(ЗаказПокупателя.Дата) = 2009\");
                         
   Выборка = Запрос.Выполнить().Выбрать();
   
   Пока Выборка.Следующий() Цикл
       
       ОбработкаПрерыванияПользователя();
       
       Объект = Выборка.Ссылка.ПолучитьОбъект();
       
       // Получим размер выгруженного объекта
       РазмерXML = Новый ЗаписьXML;
       РазмерXML.ОткрытьФайл(ИмяТемпФайла, \"UTF-8\");
       ЗаписатьXML(РазмерXML, Объект);
       РазмерXML.Закрыть();
       Размер = FSO.GetFile(ИмяТемпФайла).Size;
       
       // Какой будет размер пачки, если добавить объект? Не больше максимального?
       Если ТекРазмер + Размер > МаксРазмер Тогда
           Если ФайлОткрыт Тогда
               ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:Data
               ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:_1CV8DtUD
               ЗаписьXML.Закрыть();
               ФайлОткрыт = Ложь;
           КонецЕсли;
       КонецЕсли;
       
       // Если выгружаем первый объект в пачку или пачка была ранее закрыта - надо открыть пачку на запись
       Если Не ФайлОткрыт Тогда
           Пачка = Пачка + 1;
           // пишем для совместимости форматов с универсальной обработкой выгрузки/загрузки XML
           ЗаписьXML = Новый ЗаписьXML;
           ЗаписьXML.ОткрытьФайл(ИмяФайла + Формат(Пачка,\"ЧЦ=3; ЧВН=\") + \".xml\", \"UTF-8\");
           ЗаписьXML.ЗаписатьОбъявлениеXML();
           ЗаписьXML.ЗаписатьНачалоЭлемента(\"_1CV8DtUD\", \"http://www.1c.ru/V8/1CV8DtUD/\");
           ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(\"V8Exch\", \"http://www.1c.ru/V8/1CV8DtUD/\");
           ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(\"xsi\", \"http://www.w3.org/2001/XMLSchema-instance\");
           ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(\"v8\",  \"http://v8.1c.ru/data\");
           ЗаписьXML.ЗаписатьНачалоЭлемента(\"V8Exch:Data\");
           ФайлОткрыт = Истина;
           ТекРазмер = 0;
       КонецЕсли;
       
       // собственно сама запись объекта
       ЗаписатьXML(ЗаписьXML, Объект);
       
       // Информ-строка дабы юзверу скучно не было :)
       Объектов = Объектов + 1;
       ТекРазмер = ТекРазмер + Размер;
       Состояние(\"Объектов: \" + Объектов +\" Пачка: \" + Пачка + \" Размер: \"+ ТекРазмер);
       
   КонецЦикла;
   
   // Собственно, вот и всё выгружено :)
   Если ФайлОткрыт Тогда
       ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:Data
       ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:_1CV8DtUD
       ЗаписьXML.Закрыть();
   КонецЕсли;
   
   Возврат;
   TormozIT
 
103 - 02.10.09 - 14:33
(102) Спасибо за код. Наконец то дал что то пощупать.
Минимальное условие конечно же выполнено. Размер таким способом получается довольно с низкой абсолютной погрешностью. Однако каждый объект сериализуется по 2 раза, что уж слишком увеличивает время. Фактически мы замедляемся в 2 с лишним раза.
   asady
 
104 - 02.10.09 - 14:47
(100) кстати твой код тоже раболчий

Процедура КнопкаВыполнитьНажатие(Кнопка)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ПорогРазмераФайла = 500;
ПериодПроверкиРазмераФайла = 5;
МассивСтрок=Новый Массив;
ЗаписьXML.ЗаписатьНачалоЭлемента("АА");
Для Счетчик = 1 По 12 Цикл
    ЗаписьXML.ЗаписатьНачалоЭлемента("ББ");
    ЗаписьXML.ЗаписатьКонецЭлемента();
    Если Счетчик % ПериодПроверкиРазмераФайла = 0 Тогда
        ЗаписьXML.ЗаписатьКонецЭлемента();
        тСтрока = ЗаписьXML.Закрыть();
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.УстановитьСтроку();
        ЗаписьXML.ЗаписатьБезОбработки(тСтрока);
        ЗаписьXML.ЗаписатьНачалоЭлемента("АА");
        Если СтрДлина(тСтрока) > ПорогРазмераФайла Тогда
            Прервать;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
Сообщить(ЗаписьXML.Закрыть());
КонецПроцедуры


вот так работает.
   Wehrmacht
 
105 - 02.10.09 - 14:52
А просто жать файл средствами NTFS (ну т.е. сливать его в сжимаемую папку), например, никак?
   TormozIT
 
106 - 02.10.09 - 15:02
(104)
ЗаписьXML.ЗаписатьНачалоЭлемента("АА"); <<<<<<<<<<<<<<<<<<<<<<<
        Если СтрДлина(тСтрока) > ПорогРазмераФайла Тогда
            Прервать;
        КонецЕсли;

Эта строка отрубает всю универсальность. Нужно восстанавливать все открытые узлы каждый раз.
   TormozIT
 
107 - 02.10.09 - 15:03
(106) Точнее не все, но в обычный формат пакета не получится так писать.
   TormozIT
 
108 - 02.10.09 - 15:04
Не пойму, почему вверху допускается только один узел блин.
   Serg_1960
 
109 - 02.10.09 - 15:07
(103) Да, тормозим в алгоритме - но не в два раза :( Это ты загнул. Процентов пять теряем, не больше. Может плевать на них? Чай и так не в Формуле-1 выступаем :)
   asady
 
110 - 02.10.09 - 15:17
(108) можно сделать перед
тСтр = ЗаписьXML.Закрыть();
тСтр = СтрЗаменить(тСтр,"</АА><АА>","");
Сообщить(тСтр);
 
 Рекламное место пустует
   TormozIT
 
111 - 02.10.09 - 15:19
(110) Не катит. Код должен быть надежным.
   TormozIT
 
112 - 02.10.09 - 15:20
(109) Маловероятно, что ты прав по поводу 5%. Серьезно.
   Serg_1960
 
113 - 02.10.09 - 15:30
(109) Проверил указанный алгоритм и тоже самое, но без кода для получения размера и проверки на макс размер. Получилось: с записью во временный файл - 81сек. Без проверки размера (простая выгрузка и запись в один файл) - около 78сек. Из первого алгоритма надо еще время отнять на открытие и закрытие файлов пачек...
   Serg_1960
 
114 - 02.10.09 - 15:36
(113) + запрос на первые 2500 документов. Общая выгрузка - чуть более 20 метров.
   TormozIT
 
115 - 02.10.09 - 16:33
(113) Ладно, Уговорил. Вопрос конечно в том, какая разница будет в наших условиях (которые наверное отличаются от твоих).
Спасибо за помощь и проведенный замер скорости.
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует