|
Чем работать с большими xml | ☑ | ||
---|---|---|---|---|
0
sda553
06.10.10
✎
06:52
|
Обработка должна вырезать из xml определенный кусок в середине и сделать из него отдельную xml. Проблема что 1С валится с нехваткой памяти при больших xml
Вначале пробовал DocumentDOM //Первый вариант через DOM ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); ПостроительDOM = Новый ПостроительDOM; ДокументДом = ПостроительDOM.Прочитать(ЧтениеXML); ЧтениеXML.Закрыть(); КорневойЭлемент = ДокументДом.ПервыйДочерний; Для каждого ЭлДом Из КорневойЭлемент.ДочерниеУзлы Цикл Если ЭлДом.ИмяУзла = "tps:Needle" Тогда //Нужный нам кусок xml-ки ЗаписьДом = Новый ЗаписьDOM; ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку("UTF-8"); ЗаписьДом.Записать(ОбъектДом,ЗаписьXML); СтрокаXML = ЗаписьXML.Закрыть(); КонецЕсли; КонецЦикла; В итоге программа валится на строке СтрокаXML = ЗаписьXML.Закрыть() с окном "Недостаточно памяти". Попробовал второй вариант через элементарные объекты записи чтения //Второй вариант через ЧтениеXML и ЗаписьXML ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); Пока ЧтениеXML.Прочитать() Цикл Если ЧтениеXML.Имя = "tps:Needle" И ЧтениеXML.ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); Пока ЧтениеXML.Имя <> "tps:Needle" ИЛИ ЧтениеXML.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя); Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда Пока ЧтениеXML.ПрочитатьАтрибут() Цикл ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя,ЧтениеXML.Значение); КонецЦикла КонецЕсли; ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда ЗаписьXML.ЗаписатьКонецЭлемента(); ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение); КонецЕсли; ЧтениеXML.Прочитать(); КонецЦикла; СтрокаXML = ЗаписьXML.Закрыть(); КонецЕсли; КонецЦикла; Вначале все было хорошо и обработка вырезала объект tps:Needle размером до 150 тыс строк в xml представлении, но потом попалась такая длинная xml что все таки 1С не смогла ее переварить и вывалилась на СтрокаXML = ЗаписьXML.Закрыть(); У объекта tps:Needle в xml представлении около 250 тыс. строк. Чем все таки можно это дело оттуда вырезать? А то я уже прихожу к мысли о том что надо через текстовыйДокумент ее открывать и парсить самому... |
|||
1
Маленький Вопросик
06.10.10
✎
06:53
|
большие хмд - это какие?
|
|||
2
sda553
06.10.10
✎
06:54
|
Я же написал, в xml представлении объект до 250 тыс строк
|
|||
3
Маленький Вопросик
06.10.10
✎
06:54
|
(2) весит сколько?
|
|||
4
sda553
06.10.10
✎
06:56
|
соответственно около 250 тыс элементов в объекте, к тому же это все сидит внутри xml где еще до нужного объекта несколько таких объектов ненужных такого же размера и после него.
Вес всей xml около 300 мб, вес нужного куска около 15 Мб |
|||
5
Рэйв
06.10.10
✎
06:58
|
(4)Да найди ты свой объект напрямую блокнотом. Вырежи и вставь в новый текстовый файл.
потом этот текст читай и пиши в свежий xml |
|||
6
Маленький Вопросик
06.10.10
✎
07:00
|
(4) хм... я работал с xml-инами весом около 900 Мб! - и читал и записывал... - проблем не было таких, памяти на компе было правда 3 Гб - так что может просто памяти добавить и не заморачиваться???
|
|||
7
sda553
06.10.10
✎
07:00
|
Так мне это надо чтобы 1С это автоматом делала а не вручную. Кстати когда я пробовал руками проделать тот же фокус и открыл эту xml в текстовом редакторе, потом выделил все что до нужного куска и нажал del 1С тоже вылетела с окном "Недостаточно памяти"
|
|||
8
Маленький Вопросик
06.10.10
✎
07:02
|
(7) огласи параметры железа и что основное висит в памяти...
|
|||
9
Рэйв
06.10.10
✎
07:02
|
(7)Ну тогда памяти докидывай.Или машину ищи где ее достаточно
|
|||
10
sda553
06.10.10
✎
07:02
|
+(7) Имеется в виду текстовый редактор 1С. Блокнот открывает ее где то час - не дождался
|
|||
11
Маленький Вопросик
06.10.10
✎
07:03
|
(10) открывает час??? у тебя что там Пентиум 75?????
|
|||
12
sda553
06.10.10
✎
07:04
|
Памяти у меня 2Гб, основное что висит это firefox (сейчас когда мисту смотрю) 153 Мб, svchost 61 Мб, 1cv8 56 Мб
(11) Ну может не час, но я блокнота не дождался |
|||
13
Маленький Вопросик
06.10.10
✎
07:06
|
(12) диск С почисть - может загажен... места для темпа не хватает...
|
|||
14
sda553
06.10.10
✎
07:09
|
(13) Сейчас попробую на другой, более мощной машине тоже самое запустить, потом отпишусь
|
|||
15
Zixxx
06.10.10
✎
07:44
|
(14) 1c xml читает потоком ей пофигу какой размер файла, писал и читал xml по 3Гб никаких тормазов небыло
|
|||
16
sapphire
06.10.10
✎
08:00
|
Microsoft DOM.Document
|
|||
17
Moriarti
06.10.10
✎
08:19
|
Мне 1С-овская реализация работы с XML сразу не понравилась.
Я решил работать по старинке: function GetValue(Node, NodeName) for i = 0 to Node.childNodes.length-1 do if Node.childNodes.item(i).NodeName = NodeName then return Node.childNodes.item(i).Text; Endif; EndDo; EndFunction xmlDoc = Новый COMОбъект("Microsoft.XMLDOM"); xmlDoc.Load(TempDir+"\GetList.xml"); RootNode = xmlDoc.DocumentElement; for i = 0 to RootNode.ChildNodes.length - 1 do Node = RootNode.ChildNodes.item(i); if Node.NodeName = "Филиал" then s = GetValue(Node, "Филиал"); EndIf; EndDo; |
|||
18
Moriarti
06.10.10
✎
08:20
|
^^^ обрабатывал XML до 10 мегабайт!
|
|||
19
nop
06.10.10
✎
08:21
|
я бы XML вообще запретил
|
|||
20
Elysee
06.10.10
✎
08:22
|
Bred неплохо может читать xml
|
|||
21
Живой Ископаемый
06.10.10
✎
08:24
|
закладка
|
|||
22
Zixxx
06.10.10
✎
08:34
|
(17), (19) это видимо от незнания или непонимания
|
|||
23
Moriarti
06.10.10
✎
09:00
|
(19) Да конечно, а как данными обмениваться? через dbf-ки?
|
|||
24
Zixxx
06.10.10
✎
09:06
|
(23) Ctrl + Insert, Shift + Insert - бугага
|
|||
25
Dem1urg
06.10.10
✎
09:15
|
(17) +1 Используй XMLDOM и дальше SelectSingleNode или SelectNodes в зависимости от того, что тебе нужно. Правда придётся немного въехать в XPath, но совсем немного.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |