Ошибка разбора xml ошибка xmlsax2characters out of memory

При попытке распечатать расчет по страховым взносам в программе 1С возникает проблема Ошибка разбора XML. xmlSAX2Characters - Out of memory.
ошибка разбора xml 1С

Решение проблемы следующее:
В папке в которой у вас находится база 1С найдите файл с расширением .xml. Удалите его и всё должно заработать. Если нет то стоит также почистить папку temp в AppData > local.


[Всего голосов: 0    Средний: 0/5]

Here is the sad truth. There are two basic ways of working with XML, DOM-based, where the whole XML file is present in memory at once (with considerable overhead to make it fast to traverse), and SAX based where the file goes through memory, but only a small portion of it is present at any given time.

However, with DOM, large memory consumption is pretty much normal.

Now XSLT language in general allows constructions that access any parts of the whole file at any time and it therefore requires the DOM style. Some programming languages have libraries that allow feeding SAX input into an XSLT processor, but this necessarily implies restrictions on the XSLT language or memory consumption not much better than that of DOM. PHP does not have a way of making XSLT read SAX input, though.

That leaves us with alternatives to DOM; there is one, and is called SimpleXML. SimpleXML is is a little tricky to use if your document has namespaces. An ancient benchmark seems to indicate that it is somewhat faster, and probably also less wasteful with memory consumption, than DOM on large files.

And finally, I was in your shoes once in another programming language. The solution was to split the document into small ones based on simple rules. Each small document contained a header copied from the whole document, one «detail» element and a footer, making its format valid against the big XML file’s schema. It was processed using XSLT (assuming that processing of one detail element does not look into any other detail element) and the outputs combined. This works like charm but it is not implemented in seconds.

So, here are your options. Choose one.

  • Parse and process XML using SAX.
  • Use SimpleXML and hope that it will allow slightly larger files within the same memory.
  • Execute an external XSLT processor and hope that it will allow slightly larger files within the same memory.
  • Split and merge XML using this method and apply XSLT on small chunks only. This method is only practical with some schemas.

Here is the sad truth. There are two basic ways of working with XML, DOM-based, where the whole XML file is present in memory at once (with considerable overhead to make it fast to traverse), and SAX based where the file goes through memory, but only a small portion of it is present at any given time.

However, with DOM, large memory consumption is pretty much normal.

Now XSLT language in general allows constructions that access any parts of the whole file at any time and it therefore requires the DOM style. Some programming languages have libraries that allow feeding SAX input into an XSLT processor, but this necessarily implies restrictions on the XSLT language or memory consumption not much better than that of DOM. PHP does not have a way of making XSLT read SAX input, though.

That leaves us with alternatives to DOM; there is one, and is called SimpleXML. SimpleXML is is a little tricky to use if your document has namespaces. An ancient benchmark seems to indicate that it is somewhat faster, and probably also less wasteful with memory consumption, than DOM on large files.

And finally, I was in your shoes once in another programming language. The solution was to split the document into small ones based on simple rules. Each small document contained a header copied from the whole document, one «detail» element and a footer, making its format valid against the big XML file’s schema. It was processed using XSLT (assuming that processing of one detail element does not look into any other detail element) and the outputs combined. This works like charm but it is not implemented in seconds.

So, here are your options. Choose one.

  • Parse and process XML using SAX.
  • Use SimpleXML and hope that it will allow slightly larger files within the same memory.
  • Execute an external XSLT processor and hope that it will allow slightly larger files within the same memory.
  • Split and merge XML using this method and apply XSLT on small chunks only. This method is only practical with some schemas.

modern libxml2 versions

This does not appear to be an issue with libxml 2.9.x. For a file that’s 14M in size:

> Nokogiri::XML.parse(File.open("large.xml")).root.children.first.text.length
 => 9999894 
> puts Nokogiri::XML.parse(File.open("large.xml")).errors
xmlSAX2Characters: huge text node
Extra content at the end of the document

but notice that the HUGE config option allows us to parse the whole thing:

> Nokogiri::XML.parse(File.open("large.xml")) {|c| c.huge}.root.children.first.text.length
 => 14065665
> puts Nokogiri::XML.parse(File.open("large.xml")) {|c| c.huge}.errors
 => nil 

older libxml2 versions

The problem originally reported was with much older versions of libxml2; e.g. 2.7.3.

Compiling Nokogiri v1.7.0.1 against libxml 2.7.3:

# Nokogiri (1.7.0.1)
    ---
    warnings: []
    nokogiri: 1.7.0.1
    ruby:
      version: 2.4.0
      platform: x86_64-linux
      description: ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]
      engine: ruby
    libxml:
      binding: extension
      source: packaged
      libxml2_path: "/home/flavorjones/code/oss/nokogiri/ports/x86_64-pc-linux-gnu/libxml2/2.7.3"
      libxslt_path: "/home/flavorjones/code/oss/nokogiri/ports/x86_64-pc-linux-gnu/libxslt/1.1.20"
      libxml2_patches: []
      libxslt_patches: []
      compiled: 2.7.3
      loaded: 2.7.3

results in a segfault when parsing a large file; but the segfault can be avoided by setting the HUGE option (as above).

conclusion

Unfortunately, there’s nothing I can think of to prevent old, buggy versions of libxml2 from crashing in this case; the bug is completely internal to libxml2.

As a workaround, consider using the HUGE option; or consider using the vendored version of libxml2; or consider upgrading your system’s libxml2 version.

Apologies it took so long to close this out.

Вот грустная правда. Существует два основных способа работы с XML, основанный на DOM, где весь XML файл присутствует в памяти сразу (со значительными накладными расходами, чтобы ускорить его перемещение) и SAX, на котором файл проходит через память, но только небольшая его часть присутствует в любой момент времени.

Однако с DOM большое потребление памяти в значительной степени нормальное.

В настоящее время язык XSLT в общем позволяет создавать конструкции, которые в любой момент могут обращаться к любым частям всего файла и поэтому требует стиля DOM. Некоторые языки программирования имеют библиотеки, которые позволяют подавать вход SAX в XSLT-процессор, но это обязательно подразумевает ограничения на использование языка XSLT или памяти не намного лучше, чем у DOM. PHP не имеет способа сделать XSLT-чтение SAX-входа, однако.

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

И, наконец, я был на вашем месте один раз на другом языке программирования. Решение заключалось в том, чтобы разделить документ на небольшие, основанные на простых правилах. Каждый маленький документ содержал заголовок, скопированный из всего документа, один элемент «detail» и нижний колонтитул, делая его формат действительным для большой схемы XML файла. Он обрабатывался с использованием XSLT (при условии, что обработка одного элемента детали не рассматривается в каком-либо другом детальном элементе), а выходы объединены. Это работает как шарм, но не выполняется в секундах.

Итак, вот ваши варианты. Выберите один.

  • Разбирайте и обрабатывайте XML с помощью SAX.
  • Используйте SimpleXML и надеемся, что он позволит немного увеличить файлы в одной и той же памяти.
  • Выполните внешний XSLT-процессор и надейтесь, что он позволит немного увеличить файлы в одной и той же памяти.
  • Разделить и объединить XML, используя этот метод и применить XSLT только к небольшим фрагментам. Этот метод применим только с некоторыми схемами.

  

IamAlexy

08.03.09 — 21:26

Есть база 7.7

Выгружаю из нее данные для перехода на 8ку.

База не очень большая.. элементов справочника контрагентов имеющих остатки порядка 600 тысяч..

при выгрузке в xml после пары тройки часов вываливается  с «out of memory» причем на компе естественно никакой нехваткой памяти, процессорной мощности или жесткого диска и не пахнет.

вопрос это лечится или придется резать стандартные правила для перевода «по кускам» ?

естественно что платформы все обновлены, релизы и правила последние.

  

ТелепатБот

1 — 08.03.09 — 21:26

  

Злопчинский

2 — 08.03.09 — 21:35

гаечки поштучно учитываете?

  

IamAlexy

3 — 08.03.09 — 21:36

(2) именно.. и болтики в отдельном справочнике…
мало того в справочнике договоров хранится «левая резьба» один договор и «правая резьба» другой договор…

а по существу мысли есть?

  

Aleksey_3

4 — 08.03.09 — 21:48

Только бить, и выгружать частями

  

IamAlexy

5 — 08.03.09 — 21:50

(4) угу. просто хотел уточнить.. а то потрачу время а окажется что есть какойнить «обновленный драйвер для xml» который позволяет работать с файлами больше чем 1 гиг.

  

Cap_1977

6 — 08.03.09 — 21:50

(0) У тебя валиться XML-парсер, тот который от мелкософта. Валиться он изза того что пытается отожрать больше 2 Гб памяти (он _весь_ формируемый/считывамый xml-файл держит в памяти + его собственные глюки). Попробуй формировать выходной файл вручную — xml этоже по сути текст ))).

  

milan

7 — 08.03.09 — 21:54

(6) Скорее всего не удастся выгрузить в последовательный файл, хотя чем черт не шутит.

  

IamAlexy

8 — 08.03.09 — 22:01

(7) даже не буду пытаться.
либо по оле выгружу либо правила покоцаю чтобы частями выгружать.. подумаю еще что именно делать…

  

milan

9 — 08.03.09 — 22:04

(8) Не по спортивному получается ;)

  

ДенисЧ

10 — 08.03.09 — 22:10

поставить 64бит систему и соотв скл.

Написать выгрузку через скл.

и 8ку взять 64бит.

  

IamAlexy

11 — 08.03.09 — 22:12

(10) быстрее по оле + лицензии на х64 сервер предприятия нету :)
а система и так х64

  

milan

12 — 08.03.09 — 22:15

(11) Сдается мне что по ОЛЕ не быстро 600К контрагентов с остатками выгрузится ;)

  

IamAlexy

13 — 08.03.09 — 22:18

(12) ну думаю быстрее чем переписывать правила под SQL + смена платформ на x64 + неясный результат в итоге :)

причем по оле можно запустить в несколько потоков.
1с не занимает все ядра в процессе работы. тоесть на четырехядерном проце можно запустить четыре потока и они будут нормально в полную силу выгружаться :)

  

milan

14 — 08.03.09 — 22:21

(13)Под ОЛЕ есть готовая обработка ???

и потом непонятно как бить на части, по буквам алфавита ???

  

IamAlexy

15 — 08.03.09 — 22:22

(14) на 80% готовая.
а зачем по оле бить на части?

  

milan

16 — 08.03.09 — 22:25

(15)
>>на четырехядерном проце можно запустить четыре потока и они будут нормально в полную силу выгружаться :)
Или 4 раза одно и тоже выгружать ???

  

Cap_1977

17 — 08.03.09 — 22:26

(13) «1с не занимает все ядра в процессе работы.» — правильно, семерка писалась когда о гипертрейдинге и двухголовости еще не слыхали.
«тоесть на четырехядерном проце можно запустить четыре потока и они будут нормально в полную силу выгружаться :)» — издешь ))) будкт использваться только один камень.

  

IamAlexy

18 — 08.03.09 — 22:27

(17) хм. нужно думаешь разные процессы всеравно на первый будут вешаться ?

  

IamAlexy

19 — 08.03.09 — 22:29

(16) зачем одно и тоже:
первый выгружает допустим остатки по 62ым счетам
второй допустим по 60ым
третий какойнить там 10ый счет

естественно перед этим предварительно полная синхронизация справочников.

  

Cap_1977

20 — 08.03.09 — 22:32

(18) Да. всегда грузиться первый камень. Хочешь чтоб нагрузка распределялась на все: ставь линь (или бсд) поверх нее wmware esx server. на него гостевую вынь 2003; тогда у тебя будут загружены _все_ камни — nix разрулит.

  

milan

21 — 08.03.09 — 22:35

(19) Сами по себе остатки — мелочь, там по ссылкам цепляется всякая фигня, вот и растет файл выгрузки.
Как раз >>полная синхронизация справочников.
и занимает большую часть места в выгрузке, они же виноваты в том что для выгрузки в хмл ипользуется DOM.

(20) Закусывать надо. Операционка сама вешает процессы на разные ядра, или как она посчитает нужным. Вот распаралелить один процесс с 1с она не может.

  

IamAlexy

22 — 08.03.09 — 22:36

(20) Set Affinity в таск менеджере решает данную проблему без линуха,бсд и вмваре

  

milan

23 — 08.03.09 — 22:37

(22) Опять не по спортивному, а так поставил в вмваре линух, там в виртуалбох вин2003 а там и 1с запустил — благодать

  

IamAlexy

24 — 08.03.09 — 22:38

(23) тучные, потные, ленивые программисты 1с с отдышкой и пивом далеки от спорта…

  

Cap_1977

25 — 08.03.09 — 22:49

(21) Предложенная схема была реализована в Казани, фирмы Прогресс, база РарусАльфаАвто, никак не оптимизированная, только доточенная, юзеров онлайн сидело 60+. железка была «супермикро», 4 гига оперативы, 4 камня. Тянула еще второй DC.

  

milan

26 — 08.03.09 — 23:08

(25) Что-то я не понимаю смысл огорода. Один процесс 1С никакой вмваре или линух на несколько потоков никак не разложат. Поднимать линух, на нем вин2003 … непонятно.

  

IamAlexy

27 — 08.03.09 — 23:10

(26) там было поднято три вмваре.
каждому вмваре по ядру
в каждом вмваре по 20 пользователей :)

  

Cap_1977

28 — 08.03.09 — 23:10

(26) Смысл огорода в том, что поднимая линух и ставя на него гостевую внь ты уходишь от того что один процесс 1С исполняется на одном камне; линь раскидывает нагрузку по всем процам.

  

Aleksey_3

29 — 08.03.09 — 23:12

(27,28) А смысл? Каждый юзер юзает свой процесс 1С. А ОС сама эти процессы раскидывет по ядрам. Поэтому смысл ставить на тормознутую вирт. машину?

  

Cap_1977

30 — 08.03.09 — 23:14

(27) думмаю что так настроить было можно ))) но как то архисложно получается )))
(29) юзать то он зюзает. ыопросов нет. о только терминал на винде, в котором сидят пользователи, упорно грузит один камень.

  

Aleksey_3

31 — 08.03.09 — 23:15

Ну у меня отдельная машина под 1С и отдельная под терминал, и там и там юзаются все ядра, без извращений. На филиале все во одном, и тоже не замечал, чтобы ядра простаивали.

  

Cap_1977

32 — 08.03.09 — 23:19

(31) Установил 2003. Роль назначил: сервер терминалов. Настроил юзерам коннекты к серверу. Установил на серваке 1С. Базы положил локально. Пользователи заходят в 1С, работают. ДЗ выдает загрузку 1-го камня. Что я делаю не так ?

  

Aleksey_3

33 — 08.03.09 — 23:24

2003 какой чистый или R2? Сколько юзеров? А если в ручную назначить 1С у юзера другой камень?

  

milan

34 — 08.03.09 — 23:28

(32) Что-то делаешь не так, не нужно ставить сервер терминалов, чтобы разные процессы 1с грузили разные ядра. Запусти на локальной машине две одинески и будешь приятно удивлен.
Может что-то там с лицензиями в вин2003 ???

  

Aleksey_3

35 — 08.03.09 — 23:34

(32) Так чисто, чтобы мы понимали о чем речь. 1С у 1 юзера под виндоус не может занимать N ядер. 1С однаядерная, т.е. 1 экземпляр = 1 ядро. Но ОС может раскидывать разные экземпляры 1С на разные ядра, т.е. каждый экземпляр 1С будет занимать свое отдельное ядро (в общем случае).

  

milan

36 — 08.03.09 — 23:40

(35) В общем случае не обязательно «Каждый экземпляр 1С будет занимать свое отдельное ядро», разложит как посчитает нужным, и не факт что несколько 1с на первом ядре это плохо. На самом деле 1С довольно слабо грузит проц, в основном грузится дисковая подсистема за счет всяких временных ДБФов и прочей ахинеи.

  

Cap_1977

37 — 08.03.09 — 23:41

никс раскидывает задачи одного юзера на несколько камней.

  

milan

38 — 08.03.09 — 23:44

(37) Ты утверждаешь, что однопоточный процесс никс раскладывает на несколько ядер ???

  

Aleksey_3

39 — 08.03.09 — 23:47

(37) При этом тормоза вирт машины сводят этот плюс на нет.
Если бы у тебя было бы 20 камней и 4 юзера, тогда да. Но у тебя и так на каждом камни сидит по 5 юзеров, поэтому смысл раскидывать на то, что уже занято?

  

Cap_1977

40 — 08.03.09 — 23:51

(38) таг. в (25) мну указал что твориться если поставить никс. В (32) я задал вопрос. В (37) — вывод. Неявный вывод, но все таки.
1. Где утверждкние ?
2. Смысл ловить меня за язык ? Не работает так как как утверждаю в 25 — я мутаг. Готов сменить картинку в профиле.
3. Что мешает тебе попробывать а не молоть языком ?

  

IamAlexy

41 — 08.03.09 — 23:55

лучше бы придумали где взять волшебный_патч_заставляющий_виндовых_xml_понимать_файлы_больше_2GB

  

Cap_1977

42 — 09.03.09 — 00:05

(41) звонить в_подддержку_не пользоваться_вынью_взять_в_руки_фзыкпрограммирования. Быть, а не казаться.

  

IamAlexy

43 — 09.03.09 — 00:12

(42) см (24)

  

Cap_1977

44 — 09.03.09 — 00:17

43 это:
   Перейти Метка;

~Метка:
   Сообщить(«Сам дурак»);

или я чего то не понимаю ?

  

milan

45 — 09.03.09 — 00:32

(40) Человеку свойственно ошибаться, как в 25 проверять не стану, ибо лень. Да и никаких рекомендаций от 1с в эту сторону нет. Опять же проверять что вин2003 работает производительнее под вмварью из под никса не хочется.
а то что такая система будет работать я не сомневаюсь.
К тому же тут другая задача.
(41) переписывай под сакс модель выгрузку от 1С ;) тогда будет ограничение только на размер файла на ФС ;)

  

Cap_1977

46 — 09.03.09 — 00:34

(45) благодарю

  

romix

Модератор

48 — 09.03.09 — 04:05

  

НП

49 — 09.03.09 — 08:26

(0) Перегружать справочники лучше при помощи COM-соединения. Размер программы -операторов 15-20 плюс по оператору на каждый реквизит справочника. Запускется в режиме транзакций с периодическим завершением и началом транзакции через 200-300 элементов справочника.

  

dk

50 — 09.03.09 — 08:53

хм, а 64-битного парсера хмл мелкомягкие не выпустили?

  

w2k3

51 — 09.03.09 — 08:57

хм… у меня такая ошибка была не в 1с а просто когда открываешь файл… после перезапуска исчезает.. оказался банально вирус… он перехватывал запрос проги на достаточность памяти и посылал неверный ответ в следствии чего прогама сама по се вылетала!

<?php 
/** задача: вывести список доступных id с количеством подэлементов */
$io = false; // интуитивный переключатель прохода
$count = 0; // кол-во load'ов в over'е
$id = ''; // текущий id
$cache = @fopen('cache.txt', 'x'); // работа с кешем
if (!$cache) die ('cache exists!');

/** strread (буфер, io, счётчик, id, поток кеша) */
function strread ($buffer, &$v2, &$v3, &$v4, &$v5)
{
if (!$v2) // ищем проход
{
if (strpos($buffer, '<over') === false)
{
$v2 = false;
}
else
{
$v4 = str_replace(array('<over id="', '">', '" />'), '', $buffer);
/** можно и preg_match, но в данном случае
* мы знаем что другого быть не может,
* поэтому экономим память…
*/
$v2 = true;
}
}
else // ищем выход из over
{
if (strpos($buffer, '</over>') === false)
{
$v3++;
$v2 = true;
}
else
{
fwrite($v5, "id: $v4, loads: $v3rn");
$v3 = 0; $v4 = ''; // обнуляем переменные
$v2 = false;
}
}
}

$xml = fopen('big.xml', 'rtb'); //открыли файл
while (!feof($xml)) strread(trim(fgets($xml)), $io, $count, $id, $cache);
fclose($xml); fclose($cache); // закрываем потоки xml и cache


<ixxxxxi>
<data>nodata</data>
<over id="Anzhxicfq">
<load>like</load>
<offload>21</offload>
<offload>15</offload>
<load>like</load>
<load>like</load>
</over>
<over id="ASy8d0nas">
<load>like</load>
<load>like</load>
<load>like</load>
</over>
<over id="ASnax9z9u">
<load>like</load>
<load>like</load>
<load>like</load>
</over>
<over id="Vefu9a1AA">
<load>like</load>
<load>like</load>
</over>
<over id="NAsu9ddda" />
<over id="Zadli1110">
<load>like</load>
<load>like</load>
<load>like</load>
</over>
</ixxxxxi>

Вот печальная правда. Существует два основных способа работы с XML: на основе DOM, когда весь XML-файл одновременно находится в памяти (со значительными накладными расходами, чтобы ускорить его перемещение), и на основе SAX, когда файл проходит через память, но только небольшая его часть присутствует в любой момент времени.

Однако в DOM потребление большого объема памяти вполне нормально.

Теперь язык XSLT в целом допускает конструкции, которые в любое время обращаются к любым частям всего файла, и поэтому для него требуется стиль DOM. Некоторые языки программирования имеют библиотеки, которые позволяют подавать входные данные SAX в процессор XSLT, но это обязательно подразумевает ограничения на язык XSLT или потребление памяти, не намного лучше, чем у DOM. PHP нет пути Однако заставить XSLT читать ввод SAX.

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

И, наконец, я был на вашем месте однажды на другом языке программирования. Решение состояло в том, чтобы разбить документ на маленькие на основе простых правил. Каждый небольшой документ содержал заголовок, скопированный из всего документа, один элемент «detail» и нижний колонтитул, что делало его формат допустимым для схемы большого XML-файла. Он был обработан с использованием XSLT (при условии, что при обработке одного элемента сведений не учитывается какой-либо другой элемент сведений), и выходные данные были объединены. Это работает как шарм, но не реализуется за секунды.

Итак, вот ваши варианты. Выбери один.

  • Разбирать и обрабатывать XML с помощью SAX.
  • Используйте SimpleXML и надеюсь, что это позволит хранить файлы немного большего размера в той же памяти.
  • Запустите внешний XSLT-процессор и надейтесь, что он позволит размещать файлы чуть большего размера в той же памяти.
  • Разделите и объедините XML, используя Этот метод и применяйте XSLT только к небольшим фрагментам. Этот метод применим только для некоторых схем.
Bug #49660 libxml 2.7.3+ limits text nodes to 10MB
Submitted: 2009-09-24 15:37 UTC Modified: 2011-12-02 12:30 UTC
Votes: 8
Avg. Score: 4.6 ± 0.5
Reproduced: 8 of 8 (100.0%)
Same Version: 2 (25.0%)
Same OS: 1 (12.5%)
From: sta at netimage dot dk Assigned: gooh (profile)
Status: Closed Package: SOAP related
PHP Version: * OS: FreeBSD 7.1
Private report: No CVE-ID: None

 [2009-09-24 15:37 UTC] sta at netimage dot dk

Description:
------------
Since version 2.7.3 libxml limits the maximum size of a single text node to 10MB.
The limit can be removed with a new option, XML_PARSE_HUGE.
PHP has no way to specify this option to libxml.

I found the bug when making af SOAP-request where the reply contained a 20MB string.
SoapClient->__call() threw an exception: 'looks like we got no XML document'

Using libxml_use_internal_errors(true) and libxml_get_errors() I could narrow it down to a LibXMLError, code 5, 'Extra content at the end of the document' - but the specified line and column was in the middle of a large text node.

Using SoapClient->__getLastResponse() I saved the response to a file.
The xmllib program xmllint then revealed the cause:
> xmllint --noout soap_response.txt 
soap_response.txt:111834: error: xmlSAX2Characters: huge text node: out of memory

We need a way to specify the XML_PARSE_HUGE option to libxml - perhaps something like a new function: libxml_parse_huge(true).


Reproduce code:
---------------
<?php
$xml = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?><test>" . str_repeat('A', 12000000) . "</test>";
file_put_contents('file.xml', $xml);
$sxe = simplexml_load_file('file.xml');
if ($sxe instanceof SimpleXMLElement) {
	echo 'OKn';
}
else {
	var_dump($sxe);
}


Expected result:
----------------
OK

Actual result:
--------------
PHP Warning:  simplexml_load_file(): file.xml:1: error: xmlSAX2Characters: huge text node: out of memory in /usr/dana/data/developers/holst/mobilmap/cron/xml.php on line 5
PHP Warning:  simplexml_load_file(): AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA in /usr/dana/data/developers/holst/mobilmap/cron/xml.php on line 5
PHP Warning:  simplexml_load_file():                                                                                ^ in /usr/dana/data/developers/holst/mobilmap/cron/xml.php on line 5
bool(false)

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports

 [2009-09-26 12:12 UTC] kalle@php.net

I guess we could expose the constant value from ext/libxml if available like:
Index: libxml.c
===================================================================
--- libxml.c	(revision 288659)
+++ libxml.c	(working copy)
@@ -622,6 +622,9 @@
 	REGISTER_LONG_CONSTANT("LIBXML_COMPACT",	XML_PARSE_COMPACT,		CONST_CS | CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("LIBXML_NOXMLDECL",	XML_SAVE_NO_DECL,		CONST_CS | CONST_PERSISTENT);
 #endif
+#if LIBXML_VERSION >= 20703
+	REGISTER_LONG_CONSTANT("LIBXML_PARSEHUGE",	XML_PARSE_HUGE,			CONST_CS | CONST_PERSISTENT);
+#endif
 	REGISTER_LONG_CONSTANT("LIBXML_NOEMPTYTAG",	LIBXML_SAVE_NOEMPTYTAG,	CONST_CS | CONST_PERSISTENT);
 
 	/* Error levels */


Does this work for you when passing it to SimpleXML's $option parameter?

(Patch made against PHP_5_3, but is just a 3 line c/p to other branches)

 [2009-09-28 11:31 UTC] sta at netimage dot dk

Hi Kalle.

Thanks for replying so soon.

Your patch does fix the issue when loading directly with 
simplexml_load_file('file.xml', 'SimpleXMLElement', LIBXML_PARSEHUGE);

However the error was not originally encountered using simplexml, but using SoapClient - and there does not seem to be a way to pass libxml-options to SoapClient.

So as far as I can tell, the problem remains when using SoapClient.

/Thing

 [2009-12-01 02:06 UTC] felipe@php.net

This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 [2009-12-01 11:15 UTC] felipe@php.net

"Added LIBXML_PARSEHUGE constant to overrides the maximum text size of a single text node when using libxml2.7.3+."

 [2011-12-02 12:30 UTC] gooh@php.net

-Status: Open
+Status: Closed
-Assigned To:
+Assigned To: gooh

 [2016-01-11 16:36 UTC] pretandor at gmx dot de

For everyone who came across this bug and is not using SimpleXML directly but SoapClient, you can switch to Zend Soap Component:

(standalone)
https://github.com/zendframework/zend-soap

Answer by Zakai Hall

I have a page which load a 500 mb xml file and parses the file using an xsl template.
The parser works perfectly in my local environment. I am using WAMP.,Ok, so here is the sample piece which simulates what’s happening:,Use SimpleXML and hope that it will allow slightly larger files within the same memory.,Execute an external XSLT processor and hope that it will allow slightly larger files within the same memory.

Ok, so here is the sample piece which simulates what’s happening:

        byte[] buf = new byte[32768 - 10];

        for (; ; )
        {
            long newSize = (long)buf.Length * 2;
            Console.WriteLine(newSize);

            if (newSize > int.MaxValue)
            {
                Console.WriteLine("Now we reach the max 2Gb per single object, stopping");
                break;
            }

            var newbuf = new byte[newSize];
            Array.Copy(buf, newbuf, buf.Length);
            buf = newbuf;
        }

Answer by Colter Barrera

原文
标签

php

xml

xslt

xml-parsing

,关于php — XSLTProcessor xmlSAX2Characters : out of memory,我们在Stack Overflow上找到一个类似的问题:

https://stackoverflow.com/questions/11197337/

, Parse and process XML using SAX .

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

<?php

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

$xslDoc = new DOMDocument();

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

$xslDoc->load("template.xslt");

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

$xmlDoc = new DOMDocument();

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

$xmlDoc->load("largeFile.xml");

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

$proc = new XSLTProcessor();

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

$proc->importStylesheet($xslDoc);

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

echo $proc->transformToXML($xmlDoc);

我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。
解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中的内存不足,行:/home/mydomain/public_html/xslt/parser_large 中的 2031052第 6 行的 .php

我的代码如下,第 6 行加载 xml 文件
<?php $xslDoc = new DOMDocument(); $xslDoc->load("template.xslt");$xmlDoc = new DOMDocument(); $xmlDoc->load("largeFile.xml");$proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); echo $proc->transformToXML($xmlDoc);?>
我已经尝试将 php.ini 文件从 wamp 安装复制到上述代码所在的文件夹。但这并没有帮助。这个php.ini文件中的内存限制是memory_limit = 1000M

对此的任何建议/经验将不胜感激

?>

Answer by Adelaide Cline

XSLTProcessor::transformToXml — Transform to XML,XSLTProcessor::transformToUri() — Transform to URI,XSLTProcessor::transformToDoc() — Transform to a DOMDocument,
transformToXml

Hey! Welcome to Nicolas Eliaszewicz's sweet CD collection!

<h1>Fight for your mind</h1><h2>by Ben Harper - 1995</h2><hr>
<h1>Electric Ladyland</h1><h2>by Jimi Hendrix - 1997</h2><hr>

Answer by Nathalia Peters

XSLTProcessor xmlSAX2Characters: не хватает памяти
,
Jmeter не хватает памяти кучи
,
Amazon EC2 не хватает памяти
,
XGBoost GPU не хватает памяти

On ubuntu 14.10 (3.13.0-76-generic #120-Ubuntu SMP Mon Jan 18 15:59:10 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux), when I do:

sudo npm search yeoman-generator

Я получаю следующую ошибку:

npm WARN Building the local index for the first time, please be patient

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

<?php 
/** задача: вывести список доступных id с количеством подэлементов */
$io = false; // интуитивный переключатель прохода
$count = 0; // кол-во load'ов в over'е
$id = ''; // текущий id
$cache = @fopen('cache.txt', 'x'); // работа с кешем
if (!$cache) die ('cache exists!');

/** strread (буфер, io, счётчик, id, поток кеша) */
function strread ($buffer, &$v2, &$v3, &$v4, &$v5)
{
if (!$v2) // ищем проход
{
if (strpos($buffer, '<over') === false)
{
$v2 = false;
}
else
{
$v4 = str_replace(array('<over id="', '">', '" />'), '', $buffer);
/** можно и preg_match, но в данном случае
* мы знаем что другого быть не может,
* поэтому экономим память…
*/
$v2 = true;
}
}
else // ищем выход из over
{
if (strpos($buffer, '</over>') === false)
{
$v3++;
$v2 = true;
}
else
{
fwrite($v5, "id: $v4, loads: $v3rn");
$v3 = 0; $v4 = ''; // обнуляем переменные
$v2 = false;
}
}
}

$xml = fopen('big.xml', 'rtb'); //открыли файл
while (!feof($xml)) strread(trim(fgets($xml)), $io, $count, $id, $cache);
fclose($xml); fclose($cache); // закрываем потоки xml и cache


<ixxxxxi>
<data>nodata</data>
<over id="Anzhxicfq">
<load>like</load>
<offload>21</offload>
<offload>15</offload>
<load>like</load>
<load>like</load>
</over>
<over id="ASy8d0nas">
<load>like</load>
<load>like</load>
<load>like</load>
</over>
<over id="ASnax9z9u">
<load>like</load>
<load>like</load>
<load>like</load>
</over>
<over id="Vefu9a1AA">
<load>like</load>
<load>like</load>
</over>
<over id="NAsu9ddda" />
<over id="Zadli1110">
<load>like</load>
<load>like</load>
<load>like</load>
</over>
</ixxxxxi>

  • Ошибка разбора xml отсутствует пробел между атрибутами
  • Ошибка разбора xml неправильное имя тега
  • Ошибка разбора xml не указано значение для узла код получателя
  • Ошибка разбора xml не указано значение для узла имя криптопровайдера
  • Ошибка разбора xml код ошибки 330