Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > записать мого узлов


Автор: armor85 9.5.2008, 13:54
Здравствуйте,

при попытке записать более 2000 узлов (в каждом ещё по пять узлов),
возникает ошибка:
  Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 50 bytes) in

может можно это както обойти?

Автор: Feldmarschall 9.5.2008, 13:58
Для начала надо научиться быть немного информативнее в своих вопросах

Автор: skyboy 9.5.2008, 14:07
armor85, ограничения, наклывадемые на объем памяти, выделяемой РНР - 64 Мб. Ты их превысил в результате построения своей структуры(кстати, да, вопрос задан довольно туманно  smile ). 
1. Если можешь сменить генератор(или парсер - что ты там испольщуешь?), на такой, который не выгружает полностью дерево в память, а постоянно работает с файлом(вроде файла подкачки: взял необходимое, остальное - записал обратно в файл), то ты потеряешь в скорости, но обойдешь ограничение.
2. Если можешь сменить структуру данных, чтоб у тебя не требовалось 2000х5 узлов - ты обойдешь ограничение.
3. Если ты можешь сменить логику(алгоритм), чтоб не требовалось одновременно обрабатівать 2000х5 узлов, ты обойдешь ограничение.
А вопросы типа "у меня самолет не летает. что делать?" вызывают легкое раздражение - неужели тяжело было написать на два абзаца больше, но чтоб не вытягивать подробности по кусочкам?

Автор: armor85 9.5.2008, 14:17
Ошибку понял.

Записываю данные из базы данных MySQL, своего рода кэш, но для своих целей. 
Т.ё. 2000 товаров (например) с 5 параметрами, записываю из базы в xml в виде дерева.
Это действие выполняется один раз в час по cron. Каждый раз идёт обход всех товаров и всех
их свойств, файл переписывается полностью.

Сейчас использую domit, т.к. он легче в использовании. Но php dom была таже история.
SimpleXML нету.


Да и еще проблема, товаров может быть и 10000, а оно уже сейчас выделываться начинает.

Автор: armor85 11.5.2008, 16:06
Собственно вопрос решил, посадил всё на SimpleXML. 4000x5 полёт нормальный.

Но проблема: 
Код

$objXpath = new DOMXPath($doc);
$listPrices   = $objXpath->query('/rows/row/cell[@val="1"]');
if ($listPrices->length != 0) {
    foreach($listPrices as $price) {
     $price->nodeValue = intval(myFunc($price->getAttribute("default"), $currency, $price->nodeValue));
    }
}


Помогите переписать под SimpleXML.

Код

foreach ($xml->xpath('//cell[@val="1"]') as $t) {
echo $t->title. '<BR>';
}


$t->title почему-то пустой, хотя должно быть число.

Автор: Fortop 11.5.2008, 17:31
Цитата(armor85 @  9.5.2008,  14:17 Найти цитируемый пост)
Записываю данные из базы данных MySQL, своего рода кэш, но для своих целей. 

armor85, ты уверен, что тебе нужен кеш, на xml?

Автор: armor85 12.5.2008, 08:21
Fortop, уверен.

Код

$objXpath = new DOMXPath($doc);
$listPrices   = $objXpath->query('/rows/row');
if ($listPrices->length != 0) {
  foreach($listPrices as $price) {
   if (!(in_array($price->getAttribute("seller"), explode(",", $seller)))) { $price->parentNode->removeChild($price);}
  }
}


Помогите переделать под SimpleXML. И что я выше писал тоже.

Автор: Feldmarschall 12.5.2008, 08:51
Что-то мне тоже сомнительна польза  такого кэша

Автор: armor85 12.5.2008, 09:07
Feldmarschall, сразу скажу что это не КЭШ, это что-то типа кэша (самому смешно).

Эти файлы вроде снимка цен, по которым потом строится ценовые индексы.
Компонент который их строит работает с xml. Убиваю сразу двух зайцев, 
1. информация на определенное число, когда делался снимок, т.к. все в разных файлах
2. что что компонент просит (т.е. xml), то я ему и даю.

Вопрос актуален. ^^^

Автор: Fortop 12.5.2008, 12:41
armor85, Эти снимки дешевле, проще и удобнее хранить в БД.

И манипулировать с ними быстрее в БД, а не в XML.

Добавлено через 2 минуты и 14 секунд
Сделать же экспорт в XML - с полпинка.

Автор: armor85 12.5.2008, 13:37
Fortop, я с битриксом работаю, и поэтому на прямую в базе данных ничего хранить не могу,
а через его api слишком долго получается.

И вообще оставим тему целесообразности использования xml. Помогите лучше под simple всё переписать.
Кто поможет, + в репу. 

Автор: IZ@TOP 22.5.2008, 12:01
armor85, тебе не SimpleXML нужен, тебе нужен XMLWriter (т.е. SAX) http://ru2.php.net/XMLWriter.
Для чтения можно использовать XMLReader.
Это что касается объемов от 2Мб. SimpleXML и DOM работают нормально на объемах до 2Мб (ну и еще от сервера/количества памяти выделяемой для PHP зависит, но я бы не рекомендовал увеличивать ее объем).

Автор: armor85 28.5.2008, 12:22
IZ@TOP, Спасибо за совет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)