|
|
|
| Я установил лимит в 64 мегабайта уже, но всё равно не хватает. Получается ну ОЧЕНЬ большой массив.
Этот массив обрабатывается в цикле. Можно что-то сделать? Например, чтобы обработанная часть удалялась из массива? Ну или как-то так... | |
|
|
|
|
|
|
|
для: Shorr Kan
(18.02.2006 в 05:42)
| | А может стоит парсить всё не в один массив, а скажем по узлам второго уровня. | |
|
|
|
|
|
|
|
для: Axxil
(18.02.2006 в 11:44)
| | >А может стоит парсить всё не в один массив, а скажем по
>узлам второго уровня.
Я не понимаю как. Для этого я всё равно должен спарсить весь массив первого уровня и разбить его на узлы. Держать в памяти и прочесывать каждый из узлов. | |
|
|
|
|
|
|
|
для: Shorr Kan
(18.02.2006 в 18:26)
| | Теперь я не понимаю :)
Если массив в память помещается, тогда можно тупо разбить его функцией array_slice на несколько более мелких массивов. Это конечно долго получится, но вариант... Алгоритм: читаем массив берём первую часть (насколько памяти хватит) убиваем основной массив, работаем с первой частью, сохраняем результат, потом снова читаем главный массив выделяем вторую часть и т.д. до конца массива. | |
|
|
|
|
|
|
|
для: Axxil
(19.02.2006 в 17:08)
| | У меня возникает ассоциация:
Вот вы купили десять килограмм. Полагаете, если разложить в три сумки поровну - будет нести легче, чем 10кг - в одной?
Скрипт взял большой массив. Ему уже трудно думать, мозг устал. Разбил массив на части, создав кучу маленьких массивов. Мозга нет уже совсем. А ведь дальше нужно еще удалить большой массив и обработать маленькие. | |
|
|
|
|
|
|
|
для: Shorr Kan
(18.02.2006 в 05:42)
| | А на каком этапе перестаёт хватать памяти? Если уже в цикле, можно попытаться unset() уничтожить часть не нужных переменных. | |
|
|
|
|
|
|
|
для: cheops
(18.02.2006 в 13:39)
| | Да, в цикле. Но unset убивает всё. Полностью.
Массив - двумерный и трехмерный (кое-где). Я убиваю unset($vals[$i]); . После этого - всё пусто. | |
|
|
|
|
|
|
|
для: Shorr Kan
(18.02.2006 в 18:21)
| | >Да, в цикле.
А нельзя примерно оценить где собой происходит? И что потом случается с информацией, она попадает в базу данных или выводится в окно браузера? | |
|
|
|
|
|
|
|
для: cheops
(18.02.2006 в 22:42)
| | Я пытался определить, где сбой.. но не получилось никак.
Информация попадает в базу. Берется массив и циклом по нему. Так как массив создан из xml - там есть теги. В цикле сверяется - текущий тег такой или сякой... проверяется - если ли он уже... и тогда (если в базе не найден) - пишется в базу.. иначе - continue;
Я могу вам послать файл и дамп для разбора? | |
|
|
|
|
|
|
|
для: Shorr Kan
(19.02.2006 в 01:37)
| | Давайте, может я свежим взглядом замечу память которую ещё можно удалить... | |
|
|
|
|
|
|
|
для: cheops
(19.02.2006 в 14:24)
| | Удаляйте... То есть, послал.
Только вот я послал на оба ящика... а в ответ - Delivery reports about your email [FAILED(2)] - т.е., не дошло, говорит. | |
|
|
|
|
|
|
|
для: Shorr Kan
(19.02.2006 в 16:46)
| | Хм... странно, вроде нормально сейчас всё с почтой... писем от вас не получил... | |
|
|
|
|
|
|
|
для: cheops
(20.02.2006 в 02:05)
| | Повторил. На сей раз - без текста и темы. Только вложение. Так - отправилось... Видимо, сервер читать не любит. | |
|
|
|
|
|
|
|
для: Shorr Kan
(20.02.2006 в 06:27)
| | Получил. Сейчас посмотрю - чтоб не понятно, буду спрашивать. | |
|
|
|
|
|
|
|
для: 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:12)
| | Тогда вопрос... а $vals=""; - разве не очищает память? | |
|
|
|
|
|
|
|
для: Shorr Kan
(21.02.2006 в 07:50)
| | Очищает. | |
|
|
|
|
|
|
|
для: 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($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($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 есть похожий вариант? | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.02.2006 в 10:45)
| | Судя по всему ещё нет - расширения для работы с XML недавно появились, как и сами XML-файлы, а файлы 40 лет назад - поэтому с ними черезвычайно удобно работать, а с XML-файлами - нет. | |
|
|
|