PDA

Просмотр полной версии : Работа с большим XML файлом


Bekass
27.05.2013, 18:45
Доброго дня.
Получаю данные в ХМЛ в виде
<data>
<p id='1' name=''/>
<p id='1' name=''/>
...
<p id='20000'/></data>

Прохожу по циклу for each(var child:XML in xml..*) это ХМЛ и присваиваю атрибутам значения.
Так вот этот обход на 11тыс строк занимает 18с !!!
Есть ли какие-то альтернативные методы, как работать с большими данными ?

in4core
27.05.2013, 18:47
Так вот этот обход на 11тыс строк занимает 18с !!! Не верю. Покажите код. Проблема скорее всего в самом цикле. Кстати ускорьтесь на for вместо for each

Bekass
27.05.2013, 19:01
Вот код
xml_all = new XML(str_xml);
// замеряю тут
for each(var child:XML in xml_all..*)
{
child.@name= "XXX";
child.@date= "YYY";
}
// замеряю тут


Добавлено через 3 минуты
ИЛИ так еще дольше

var tt1_:Number = (new Date()).getTime();
var ix:int=0;
while(xmlDP.entry[ix])
//for each(var child:XML in xmlDP.entry)
{
xmlDP.entry[ix].@id_doc=String(ix);
xmlDP.entry[ix].@id_row=String(ix);
ix++;
}
var tt2_:Number = (new Date()).getTime();
trace(ix+' tt:'+String(tt2_-tt1_))

in4core
27.05.2013, 19:06
for(var i:int = 0; i < xml.children().length(); i++)
{
xml.p[i].@name = "XXX";
xml.p[i].@date = "YYY";
}
замерь

Добавлено через 3 минуты
Даже если будет идти такая долгая перетрубация, я так понимаю это идет в ините приложения, то есть пока оно не отрботает - приложением пользоваться не получится. В связи с этим можно сделать так.

tf.text = "Загрузка данных";
for(...)
tf.text = "ok";

Ну или экран повесить какой то, или прелоадер пустить красивый. Вообщем это не страшно, а вот если во время исполнения приложения такие фентифлюшки , то лучше разбивать XML на уровни, и брать нужный ТОГДА, когда это потребуется

Babylon
27.05.2013, 20:14
Что ж там в этих 11 тысячах строк и для чего XML как не структуирования?

Bekass
27.05.2013, 20:14
Еще дольше 18с

Добавлено через 1 минуту
Что ж там в этих 11 тысячах строк и для чего XML как не структуирования?

В нем список данных одноуровневый для датагрида

Babylon
27.05.2013, 20:17
дата грид не умирает? 18 сек это по божески:)

Добавлено через 36 секунд
и сервера у вас конечно нет в кустах?

GBee
27.05.2013, 21:00
for(var i:int = 0; i < xml.children().length(); i++)
Первая оптимизация - вынести длину в переменную, здесь прирост скорости будет в разы. Ну и самих детей сразу хмллист вынести, тут не уверен.

Idon'tKnow
27.05.2013, 21:33
Да, GBee вещь говорит. Хоть у Вас и не такие большие значения, но вот примерная разница:

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var someString:String = "just test!";
var lengthSomeString:int = someString.length;
var secondTime:Number = 0;
var firstTime:Number = (new Date()).getTime();
var testValueLength:int;
var i:int = 0;

for (i; i < 100000000; i++) {
testValueLength = someString.length;
}
firstTime = (new Date()).getTime() - firstTime;
trace(firstTime + "= с обращением к свойству строки при каждой иттерации цикла.");
secondTime = (new Date()).getTime();

for (i = 0; i < 100000000; i++) {
testValueLength = lengthSomeString;
}
secondTime = (new Date()).getTime() - secondTime;
trace(secondTime + "= с обращением к ссылке на свойство строки при каждой иттерации цикла.");
}

}

16088= с обращением к свойству строки при каждой итерации цикла.
9564= с обращением к ссылке на свойство строки при каждой итерации цикла.