Poslji XML

Vse kar se tiče programiranja za internet.
Odgovori
odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Poslji XML

Odgovor Napisal/-a odisej » 03.08.2010 08:15:29

Ne se jezit, za XML uporabljam kar xml, ki prede poleg Delphija in ne Omni. Seveda pa vprašanje velja tudi za Omni.

Na serverju se gradi xml datoteka. Ta lahko vključuje tudi slike, zato lahko postane xml precej velik. Sedaj je to preko Indyja treba poslati klientu. Trenutni sistem je tak, da se xml shrani v memory stream, potem pa se to pošlje. Izgleda, da pretvorba xml v memory stream kar nekaj časa traja. Je to res možno? Glavno vprašanje pa je to, ali ima xml (kaj pa omni) kakšen property, ki bi kazal na začetek memorije, da bi lahko indyju rekel od te adrese naprej pošlji toliko bajtov. Mogoče še kakšna ideja? Kaj pa kakšni nativ xml class, ki se kupi, mogoče bi delal hitreje?

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Poslji XML

Odgovor Napisal/-a Runner » 03.08.2010 08:28:02

Najprej povej o kako velikih XML-jih govorimo? Pa to koliko časa dejansko traja shranjevanje v stream? Jaz osebno s tem še nisem imel težav. Shranjevanje bi moralo biti precej hitro, saj "In Memory" prezentacijo XML-ja samo shraniš v stream. Branje je precej bolj zamudno ker je treba parsati XML datoteko ali stream. Upam da uporabiš kompresiojo strema ker boš pošiljal veliko manj podaktov na ta način. Seveda bo samo shranjevanje v stream še vedno enako dolgo.

Ne moreš imeti pointerja na začetek memory-ja ker XML je v RAM-u predstavljen kot DOM, torej kot nabor classov / interface-ov, to ni nek blok RAM-a ki bi ga ti samo prebral. Shranjevanju ne uideš in ne vidim kako bi lahko bi kakšen drug XML parser hitrejši. Če imaš res velike težave s tem potem je mogoče da si si izbral napačno tehnologijo za to nalogo.

Silver_War
Prispevkov: 664
Pridružen: 01.06.2004 14:50:41

Poslji XML

Odgovor Napisal/-a Silver_War » 03.08.2010 18:32:09

Predvidevam, da uporabljaš komponent TXMLDocument. Kolikor jaz vem komponenta TXMLDocument vse podatke vedno shranjuje v datoteko. TO je tista datoteka, katero moraš navest ob kreiranju komponente, oz. datoteka, ki jo potem naknadno naložiš. Mislim, da je ravno tu razlog za počasno nalaganje XML-a v MemoryStream, saj moraš ti vse te podatke prebrati iz diska in verjetno ti nerabim razlagat, da je branje podatkov iz diska veliko počasnejše kot pa it spomina. Če je moje predvidevanje pravilno, potem imaš dve rešitvi.
1. Za delo i XML uporabiš drugo komponento, ki omogoča delo z XML-om, ki se nahaja v spominu. Problem ti bo nastal zaradi omejitve velikosti spomina.
2. Kreiraj TFileStream, ki bo dejansko kazal na tvojo XML datoteko na disku in potem tega pošlji s pomočjo Indy-a. Uporaba TMemoryStream-a v tem trenutku verjetno sploh ni potrebna, saj dandanes diski omogočajo večjo hitrost branja podatkov, kot pa je prenos le teh preko interneta.

Jaz mislim, da bi bila v tvojem primeru uporaba druge rešitve še najlažja.

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Poslji XML

Odgovor Napisal/-a Runner » 03.08.2010 19:26:24

@Silver_War

Če jaz prav razumem on celoten XML skonstruira "in memory", potem pa samo shrani v stream in pošlje. Torej problem sploh ni branje XML-ja ampak shranjevanje v stream.

Uporabniški avatar
Lipe
Prispevkov: 232
Pridružen: 12.10.2005 11:31:25
Kraj: Kranj

Poslji XML

Odgovor Napisal/-a Lipe » 03.08.2010 21:10:56

zaradi omejitve velikosti spomina.
Pomnilnika, ne spomina. Spomin je funkcija naše zavesti, karkoli že to je. Pomnilnik je del (elektronskega) računalnika, ki hrani informacije (iz SSKJ).
Nič ni nič, pa tudi nekaj ni bogve kaj.

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Poslji XML

Odgovor Napisal/-a odisej » 04.08.2010 09:43:43

Jah fantje, zdej bom malo bolj odsoten, ker je trenutno brisanje ritk bolj pomembno, sicer pa drži, xml se kreira v memoriji, v xml se recimo tudi zapiše metafile, ki se kreira z drugo komponento, tudi v memoriji, tak metafile ima lahko noti tudi sliko, ki se je pa prebrala iz diska. Potem nastane xml, ki je recimo velik 15M. Neki mi nagaja AQTime, pa sem malo z F8 skakal okrog in gledal, iz katere funkcije se dolgo ne vrne. Nekako se mi zdi, da je to ravno ta, ki xml shrani v memory stream. Prenos potem po TCP/IP je zgleda pa ful hiter in tudi zgleda, da se xml na klientu obdela ful hitro.

Odgovori