Имя: Пароль:
1C
1С v8
ЧтениеXML. Узнать количество узлов или что-то в этом роде
0 1dvd
 
14.07.17
08:20
Читается огромный файл и хотелось бы хоть как-то сделать прогресс бар. Никак не узнать количество узлов или хоть какую-то инфу о размере файла, ходе выполнения?
1 butterbean
 
14.07.17
08:23
а как читается то?
2 butterbean
 
14.07.17
08:26
(1)+ можно, например, через ДокументDOM, там есть методы подсчета количества узлов
3 Fragster
 
гуру
14.07.17
08:29
если файл делаешь сам, то в корневой элемент засунь количество объектов атрибутом. если не сам, то тогда только, если читаешь не через чтениеХМЛ, оно хорошо тем, что работает последовательно и по этому не жрет памяти, но узнать что-то "вперед" - нереально
4 1dvd
 
14.07.17
08:29
(1) Просто ЧтениеXML


    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяФайла);
    Пока ЧтениеXML.Прочитать() Цикл
5 1dvd
 
14.07.17
08:30
(3) выгрузка КД, не хотелось бы её курочить
6 NorthWind
 
14.07.17
08:30
(0) чтением XML нельзя, как я понимаю. Оно читает от начала и до упора, количество там никак не прогнозируется.
7 Genayo
 
14.07.17
08:38
(0) Прикинь размер файла относительно количества элементов, примерно высчитывай.
8 Имитация работы
 
14.07.17
08:48
(0) Узнать длину файла. Попробовать опоеделить длину строки XML считанного узла. Сделать поправку на число байт в символе и ты получишь примерное положение в файле. Плюс минус разделители строк.
9 Имитация работы
 
14.07.17
08:50
(0) Или одновременно с чтением записывай прочитанное куда-нибудь строками. Длина записанного будет прогрессом.
10 Имитация работы
 
14.07.17
09:03
(0) Или открыть файл дважды. Читать как текст и параллельно - как xml. Хотя, не уверен, что чтениеxml такое позволит...
11 НЕА123
 
14.07.17
09:04
может так, грубо...
СтрЧислоВхождений(ТекстXML, "<" )
12 Имитация работы
 
14.07.17
09:09
(11) Некошерно, надо весь файл в память считывать. Тогда уж можно и точно посчитать...
13 1dvd
 
14.07.17
09:10
Похрен, буду выводить количество прочитанных узлов. Если каждый день делать эту загрузку, то примерное количество всех будет уже известно
14 Юрий Лазаренко
 
14.07.17
09:17
В (2) правильный ответ, если, конечно, файл не гигантского размера.
16 vadim777
 
14.07.17
09:25
(5) Все таки решил курочить?
20 Юрий Лазаренко
 
14.07.17
09:33
Но если файл действительно огромный, то есть еще потоковое чтение данных. Там можно порциями выбирать куски файла (примерно как перебирать выборку запроса), и обрабатывать их. При выборе куска файла система возвращает его содержимое и размер. Размеры накапливаем в какой-то переменной, делим на общий размер файла, умножаем на 100 и таким образом получаем проuhtcc обработки а процентах.
23 1dvd
 
14.07.17
09:38
200 метров - это огромный?
25 Юрий Лазаренко
 
14.07.17
09:40
(23) Тут правильнее мерять не в метрах, а в количестве узлов. Если там 10 узлов по 20 метров каждый, то не много, а если 20000 узлов - то много.
26 1dvd
 
14.07.17
09:41
(25) около 5млн узлов
27 Имитация работы
 
14.07.17
09:42
(25) Это важно для предлагаемого вами чтения всего файла и построения в памяти структуры dom?
28 Юрий Лазаренко
 
14.07.17
09:43
(26) Тогда чтобы прочитать это через DOM, надо будет сначала все загрузить в оперативку. Скорее всего заглохнет.
29 Имитация работы
 
14.07.17
09:45
(28) Но это же только что был правильный вариант! Как же так, Юрий?
30 Юрий Лазаренко
 
14.07.17
09:45
(27) Да, это важно. Вся эта структура не нужна в оперативке, тем более, что там 5 млн узлов. В этом случае логичнее пробовать потоковое чтение.
31 Юрий Лазаренко
 
14.07.17
09:46
(29) Внимательно перечитываем (14), особенно последние 6 слов. Или с первого раза не дошло?
32 Имитация работы
 
14.07.17
10:09
(31) Юрий, я вас не понимаю. То есть, согласно (25), если файл в 200 мегабайт, состоит из 10 узлов с двоичными данными, то он не огромный и ваше (14) применимо, а если в файле в 200 мегабайт 5 млн текстовых узлов, то он огромный и надо читать последние 6 слов?
33 Вафель
 
14.07.17
10:14
сейчас прогресс бар с конечным состоянием практически никто не делает. делай просто крутящийся кружок и колво загруженых
34 Юрий Лазаренко
 
14.07.17
10:22
(32) Да, все верно, учитывая, что по условию задачи надо посчитать количество узлов.
35 Вафель
 
14.07.17
10:25
200м вроде не много должно занять в памяти. можно прочитать кол-во узлов. закрыть и далее читать стандартно
36 Юрий Лазаренко
 
14.07.17
10:28
(35) Проблема как раз в количестве узлов. DOM при 5 миллионах скорее загнется с большой долей вероятности. Хотя ТС может это легко проверить за 15 минут на своем севаке.
37 Лефмихалыч
 
14.07.17
10:30
(26) и кто будет смотреть на этот прогрессбар?..
Сделай, как в типовых обменах данными реализовано, - там просто кружок, который вертится постоянно, символизируя, что все работает и ни чего не сломалось.
38 Юрий Лазаренко
 
14.07.17
10:32
(37) С прогрессбаром можно посчитать примерное время окончания обработки файла, иногда это бывает полезно.
39 Лефмихалыч
 
14.07.17
10:34
(38) ну, узнал ты, что это будет через час. Дальше что?
Кому это может пригодиться и зачем?
Такие штуки должны происходить сами где-то на сервере без пользователей. А серверу прогрессбары не нужны
40 Юрий Лазаренко
 
14.07.17
10:37
Серверу и 1С в принципе не нужна.
41 Мыш
 
14.07.17
10:41
Пользователю нужно оповещение по электропочте или смс о завершении работ )
42 Serg_1960
 
14.07.17
10:41
А может быть прогресс бар и не потребуется?
http://catalog.mista.ru/public/311011/

"Что касается быстродействия..., то на файле 10 000 записей полная обработка заняла 30 секунд  и на файле в 100 мегабайт линейно увеличилась в 10 раз."

"Этот метод немного проще чем простой перебор узлов в DOM документе, но быстродействие... При 10 000 записей 69 секунд , а для 100 000 обработка длилась более часа, так и не завершилась, после чего была снята принудительно."

"Пятый метод схож с предыдущим, но глобальной фабрике XDTO подается на вход не только сам XML документ, но и его тип... Метод замечательный, как по простоте создания, так и по быстродействию – 3,1 секунды на 10 000 записях."