Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: При парсинге xml-структуры не хватает памяти

Сообщения:  [1-10]   [11-19] 

 
 автор: cheops   (22.02.2006 в 13:54)   письмо автору
 
   для: Shorr Kan   (22.02.2006 в 10:45)
 

Судя по всему ещё нет - расширения для работы с XML недавно появились, как и сами XML-файлы, а файлы 40 лет назад - поэтому с ними черезвычайно удобно работать, а с XML-файлами - нет.

   
 
 автор: Shorr Kan   (22.02.2006 в 10:45)   письмо автору
 
   для: cheops   (21.02.2006 в 13:21)
 

Оказывается, падает он на xml_parse_into_struct . Видимо - слишком большой массив с данными. Нет обходного пути превращения xml в массив, но не столь памятозатратного?

Возможно, нижеприведенный вариант поможет... Но проблема в том, что он выводит мне только названия тегов. Имена. Никак не value, src и аттрибуты... а нужны мне именно они.


<?
$file 
"data.xml";
$depth = array();

function 
startElement($parser$name$attrs) {
    global 
$depth;
    for (
$i 0$i $depth[$parser]; $i++) {
        print 
"  ";
    }
    print 
"$name<br>";
    
$depth[$parser]++;
}

function 
endElement($parser$name) {
    global 
$depth;
    
$depth[$parser]--;
}

$xml_parser xml_parser_create();
xml_set_element_handler($xml_parser"startElement""endElement");
if (!(
$fp fopen($file"r"))) {
    die(
"could not open XML input");
}

while (
$data fread($fp4096)) {
    if (!
xml_parse($xml_parser$datafeof($fp))) {
        die(
sprintf("XML error: %s at line %d",
                    
xml_error_string(xml_get_error_code($xml_parser)),
                    
xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
?>



Просто... если взять аналогию с файлами - функцией file один большой файл не взять - приходится использовать fread. Полагаю - и в xml есть похожий вариант?

   
 
 автор: cheops   (21.02.2006 в 13:21)   письмо автору
 
   для: Shorr Kan   (21.02.2006 в 07:50)
 

Очищает.

   
 
 автор: Shorr Kan   (21.02.2006 в 07:50)   письмо автору
 
   для: cheops   (20.02.2006 в 14:12)
 

Тогда вопрос... а $vals=""; - разве не очищает память?

   
 
 автор: cheops   (20.02.2006 в 14:12)   письмо автору
 
   для: Shorr Kan   (20.02.2006 в 06:27)
 

Знаете, когда меня припирает стараюсь разменять память на время. Т.е. вот этот блок
<?php
  $vals
=svm_xml('xml_categories.php?shop=627&no_products=1&no_subcats=1');
  print 
"<pre>";
  for(
$i=0;$i<count($vals);$i++){
?>

Разбиваю на несколько
<?php
  $vals
=svm_xml('xml_categories.php?shop=627&no_products=1&no_subcats=1');
  for(
$i 10000$i count($vals); $i++) unset($vals[$i]);
  for(
$i=0;$i<10000;$i++){
?>

Потом, предварительно уничтожив всё при помощи unset(), берём следующих блок
<?php
  $vals
=svm_xml('xml_categories.php?shop=627&no_products=1&no_subcats=1');
  for(
$i 0$i 10000$i++) unset($vals[$i]);
  for(
$i 20000$i count($vals); $i++) unset($vals[$i]);
  for(
$i=10000;$i<20000;$i++){
?>

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

   
 
 автор: cheops   (20.02.2006 в 14:05)   письмо автору
 
   для: Shorr Kan   (20.02.2006 в 06:27)
 

Получил. Сейчас посмотрю - чтоб не понятно, буду спрашивать.

   
 
 автор: Shorr Kan   (20.02.2006 в 06:27)   письмо автору
 
   для: cheops   (20.02.2006 в 02:05)
 

Повторил. На сей раз - без текста и темы. Только вложение. Так - отправилось... Видимо, сервер читать не любит.

   
 
 автор: cheops   (20.02.2006 в 02:05)   письмо автору
 
   для: Shorr Kan   (19.02.2006 в 16:46)
 

Хм... странно, вроде нормально сейчас всё с почтой... писем от вас не получил...

   
 
 автор: Shorr Kan   (19.02.2006 в 17:48)   письмо автору
 
   для: Axxil   (19.02.2006 в 17:08)
 

У меня возникает ассоциация:

Вот вы купили десять килограмм. Полагаете, если разложить в три сумки поровну - будет нести легче, чем 10кг - в одной?

Скрипт взял большой массив. Ему уже трудно думать, мозг устал. Разбил массив на части, создав кучу маленьких массивов. Мозга нет уже совсем. А ведь дальше нужно еще удалить большой массив и обработать маленькие.

   
 
 автор: Axxil   (19.02.2006 в 17:08)   письмо автору
 
   для: Shorr Kan   (18.02.2006 в 18:26)
 

Теперь я не понимаю :)
Если массив в память помещается, тогда можно тупо разбить его функцией array_slice на несколько более мелких массивов. Это конечно долго получится, но вариант... Алгоритм: читаем массив берём первую часть (насколько памяти хватит) убиваем основной массив, работаем с первой частью, сохраняем результат, потом снова читаем главный массив выделяем вторую часть и т.д. до конца массива.

   

Сообщения:  [1-10]   [11-19] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования