Ahojte
robim program ktory nacita z XML hodnoty a nasledne ich vlozi do JTable. Je to v pohode kym je v xml 30 poloziek.. ale pri 1500 to zaberie 5min. Chcel by som sa spytat:
1) ci je to normalne:-) ale poznate nejaku fintu ako to urychlit (pricom naseldny zapis zmenenych dat do toho isteho xml trva 2 sek.)...
2) ako dat niekam vypisovat na kolkej polozke sa uz nachazda. (toto funguje len na konzole cez System.out.println ale neviem to vypisat na formular.. ani ked dam vytvorit dalsie form. okno aj to je zamrznute = a to som to robil cez vlakna)
PS. to vytiahnutie dat z xml robim nasledovne:
kliknutim na Button sa zavola metoda hodnoty()
String[][] hodnoty = Data.hodnoty();
Object[][] data = new Object[hodnoty.length][4];
for (int i = 0; i < hodnoty.length; i++)
{
data[i][0] = hodnoty[i][0];
data[i][1] = hodnoty[i][1];
data[i][2] = new Boolean(Boolean.parseBoolean(hodnoty[i][3]));
data[i][3] = i;
}
jTable1.setModel(new javax.swing.table.DefaultTableModel(
data,
new String [] {
"Nazov", "Parameter 1", "Vysledok", "ID"
}
)
a metoda hodnoty() v triede Data vyzera nasledovne (public static String[][] hodnoty()):
....... ... XPathExpression expr = xPath.compile("//p[@id]");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
System.out.println("Pocet zaznamov: " + nodes.getLength());
data = new String[nodes.getLength()][4];
for (i = 0; i < nodes.getLength(); i++) {
data[i][0] = (String) xPath.evaluate(("//parameter1"), doc, XPathConstants.STRING);
data[i][1] = (String) xPath.evaluate(("//parameter2"), doc, XPathConstants.STRING);
data[i][2] = (String) xPath.evaluate(("//parameter4"), doc, XPathConstants.STRING);
data[i][3] = (String) "" + i;
// policko.add("" + i);
}
return data; .....
Dakujem za pripomienky
Fórum › Java
Zamrznutie programu pri natiahnutí velkého mnozstva dat
Můžeš zkusit použít něco efektivnějšího než XPath, třeba SAX (http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/package-summary.html). Dělá se to tak, že si vytvoříš svojí implementaci třídy org.xml.sax.helpers.DefaultHandler, kde přepíšeš metody aby zpracovali tvoje XML.
Zamrzá ti to, protože to nejspíš voláš ze stejného vlákna.
a ta extremni rychlost muze byt i tim, ze mas getLength() uvnitr for cyklu..
a pokud to jeste parser prochazi pokazde znova, tak uz sou to nasobky exponencialni slozitosti (ne li mocniny)
to: KIIV: vytiahnut getLength pred cyklus do premennej nepomohlo.. nemalo to na to vplyv (ale vyzeral to ako dobry napad) dik
to Anonym: to ze to bezi v tom istom vlakne je pravda a je to aj dovod preco to mrzlo a ten napad so SAXom je super, tam to cele trvalo 4 sek. :-) Akurat sa mi to este nepodarilo zakomponocvat do mojho riesenia (neviem ako z vnutornej triedy DefaultHandler dHandler = new DefaultHandler(){... konstruktory...} vytiahnut to pole data (dari sa mi ho uspensne naplnat tymi hodnotami z xml ale nechce mi to vratit tie hodnoty aby som s nimi vedel pracovat.. Ak mozte, tak mi s tym este helfnite, aspon nacrtnite riesenie... Diik :smile14:
To KIIV : To je zbytocne posielat.. je jasne ze to robim zle ked to tak dlho trva. Pozrite sa na ten kod a skuste mi napisat ako viem dostat von mimo dHandler to pole data[][]... subor je funkcny , parsuje spravne xml ale za ten svet z tade tie data v poli nedostanem:-)
DIIIIK
To vlado0991 :
kazdopadne xml::simple v perlu soubor o 20000 polozkach do datove struktury za 0,7s pokud byl tvar <item a="..." b="..." c="..." d="..." />
a 3.6s pokud byl tvar:
<item><a>...</a><b>...</b><c>...</c><d>...</d></item>
...
proste zvaz jestli to nebude rychlejsi zpracovavat sam :D
Buď si tu proměnnou do který to ukládáš musíš nadeklarovat už v metodě main, nebo si vytvoř novou třídu, která je potomkem DefaultHandler a v tý definuj getData. Pokud si tu proměnou deklaruješ v main, tak musí být final (např. final String[][] data ...).
to KIIV:
To že to je v perlu rychlejší je jasný. Perl je optimalizovaný na práci s textem. Viděl jsem i nějaká porovnání myslím že s javou 1.4, kde práce se stringy byla v perlu asi 10x rychlejší. V novějších verzích javy to je o trochu lepší, ale pořád nic moc. V javě nic rychlejšího pro parsování xml než sax není. Navíc ani napsáním vlastního parseru se to o moc nezrychlí. Jediné co může při použití SAX zdržovat je režie volání těch funkcí, jinak je to shodné s čtením textu po znacích.
To Anonymní uživatel : SUPER !!!! vyriesene... isiel som na to cez vytiahnutie data ako final na zaciatok metody... tam som sa dostal sice predtym aj sam, ale "zlakol" som sa toho ked mi vypisalo ze to musi byt final. Nevyskusal som tu moznost.. Ale teraz max. spokojnost :-) Dakujem
final to musí být abys zajistil, že se nezmění instance objektu přiřazeného do proměnné. Třeba těžko říct jak by se měl chovat následující kód:
String[] data = new String[10];
InnerClass ic = new InnerClass() {
public void do() {
for(int i = 0; i < data.length; i ++) {
data[i] = ...
}
}
}
data = new String[5];
ic.do(); //zapisovat do původního objektu (new String[10]) nebo do nově vytvořeného(new String[5])?
Sorry ze to otvaram este, ale nasiel som aj rychle riesenie cez XPath... 40.000 zaznamov za 4 sek.. do pola data[][]
org.w3c.dom.NodeList parametre1 = (org.w3c.dom.NodeList) xPath
.evaluate(co, doc, javax.xml.xpath.XPathConstants.NODESET);
a nasledne cez cyklus:
for (int i = 0; i < pocetParametrov1; i++)
data[i][0] = parametre1.item(i).getTextContent();
40.000 zaznamov ale malo problem s pamatou:-) To som nasledne upravil zaznamom vo VM -Xms512m a fachčí to:-)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Ukladanie velkeho mnozstva suborov — založil marioff
Ukladanie velkeho mnozstva moznosti — založil marioff
čtení velkého objemu dat ze socketu — založil Honza
Uložení dat programu. — založil Luckaa
Pomoc při vkládání dat — založil TenglerDaniel
Moderátoři diskuze