Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   default timeout period of 15 seconds (http://www.flasher.ru/forum/showthread.php?t=115403)

me2 28.08.2008 18:03

огромный XML и default timeout period of 15 seconds
 
Вот засада! У меня xml (не мой) имеет в себе 3564 item`ов, Загрузив всё это дело во flash, и попытавшись просто прогнать их в цикле:
Код:

for(var z:int=0;z<fondsXML.elements('*').length();z++){}
получил ошибку:
Цитата:

A script has executed for longer than the default timeout period of 15 seconds.
Вобщем чё делать то? где я не прав?

ramshteks 28.08.2008 18:15

эт такая защита флеша от повисания)
очевидно что твой цикл работает слишком долго.

и немного смущает .length() понится это свойство а ни метод.
хотя может я не прав

me2 28.08.2008 18:19

дада, из-за length() вся проблема и возникла.
решилось так:
Код:

var len=fondsXML.elements('*').length();
for(var z:int=0;z<len;z++){}

рано я паниковать начал =))

me2 28.08.2008 18:37

нитуттобыло. любой вызов методов в этом цикле вешает скрипт наглухо.
Даже такой:
Код:

var len=fondsXML.elements('*').length();
for(var z:int=0;z<len;z++){
var innerXML:XML=XML(fondsXML.elements('*')[z]);
}

что, где не так? неужели флеш не умеет работать с большими XML?

ramshteks 28.08.2008 18:51

а вы умеете работать с ХМЛ?
может проблема в этом?

me2 28.08.2008 18:58

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

tyapichu 28.08.2008 20:04

а с помощью for each не легче цикл по XML гонять? не надо придумывать дополнительных переменных типа len и z...

что-то типа того.
Код:

for each (var map:XML in XML_data..map)
{
        map.@name = name;
}


BlooDHounD 28.08.2008 20:47

все переменные определим заранее, для чистоты эксперимента.
Код:

var xml:XML = <xml><x /><x /><x /></xml>;

var t:Number;
var i:uint;
var j:uint;

var l:uint;

var test:XML;
var list:XMLList;

t = getTimer();
for ( i=0; i<1E5; i++ ) {
        l = xml.elements("*").length();
        for ( j=0; j<l; j++ ) {
                test = XML( xml.elements("*")[j] );
        }
}
trace( "elements + XML = ", getTimer() - t );

t = getTimer();
for ( i=0; i<1E5; i++ ) {
        // заменим elements("*") просто на *.
        // теже яйца, только вид сбоку
        l = xml.*.length();
        for ( j=0; j<l; j++ ) {
                test = XML( xml.*[j] );
        }
}
trace( "* + XML = ", getTimer() - t );


t = getTimer();
for ( i=0; i<1E5; i++ ) {
        l = xml.*.length();
        for ( j=0; j<l; j++ ) {
                // уберём XML. зачем из XML создавать новый XML не понятно
                // если бы ла нужна конвертация, то надо было использовать оператор as.
                // но тут она незачем, так как это E4X
                test = xml.*[j];
        }
}
trace( "* = ", getTimer() - t );

t = getTimer();
for ( i=0; i<1E5; i++ ) {
        // вынесем наш спиок зарание в начало
        list = xml.*;
        l = list.length();
        for ( j=0; j<l; j++ ) {
                test = list[j];
        }
}

trace( "* + list = ", getTimer() - t );

t = getTimer();
for ( i=0; i<1E5; i++ ) {
        // поиграемся в for each
        for each ( test in xml.* ) {
                // собственно тут всё ...
        }
}

trace( "for each = ", getTimer() - t );

t = getTimer();
for ( i=0; i<1E5; i++ ) {
        list = xml.*;
        for each ( test in list ) {
                // собственно тут всё ...
        }
}

trace( "for each + list = ", getTimer() - t );

получили, что 3 самый быстрых варианта, практических равных по скорости:
* + list
for each
for each

разница в пару миллисекунд на тысяче итераций, можно опустить.

итог: тоесть, да, Вы не умеете работать с XML.

me2 28.08.2008 21:35

tyapichu легче конечно. Я сюда запостил то что первое "подвернулось под голову".

BloodHound спасибо за то что откликнулся и даже потратил время, но прости я не понял что ты пытался объяснить? =)
Ты гоняешь по огромному циклу вот этот XML? "<xml><x /><x /><x /></xml>"
И пытаешься тучу раз его парсить? Конечно же результаты будут в милисекунды на любом способе. (1 в три раза дольше, да)
Попробуй прочитать мой первый пост, и понять, что дело имеется с огромным массивом данных. ~200kb, с кучей вложений и так далее.
Любое действие не в цикле с таким XML занимает некоторое время.
Попробуй погоняй эти тесты на чём то действительно большом, и тогда быть может мы оба будем знать чуточку больше ;)

P.s.
Проблему я решил, разбив данные на части, всё работает достаточно быстро.

ramshteks 28.08.2008 21:58

что то мне не удалось предыдущий пост отредактировать. прошу прощения в нем был не прав!

Код:

var xml:XML = <xml>...их тут очень много около 4000<x/></xml>;

var t:Number;
var i:uint;
var j:uint;

var l:uint;

var test:XML;
var list:XMLList;

t = getTimer();
//for ( i=0; i<1E5; i++ ) {
        l = xml.elements("*").length();
        for ( j=0; j<l; j++ ) {
                test = XML( xml.elements("*")[j] );
        }
//}
trace(j+ "  elements + XML = ", getTimer() - t );


тест показал на моей машине:
3890 elements + XML = 12573

Вывод:BloodHound вы не правы, человек умеет работать с хмл просто действительно машина подвисает на данной операции.


Часовой пояс GMT +4, время: 07:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.