Sziasztok!
Fejlesztek egy webes alkalmazást, ahol képekre kell letenni kis pontokat, nagy számban, és a letett pontok koordinátáit tárolni. A dolog jól is működik, létrehoztam egy tömböt, amibe eltárolódik, hogy hanyadik pont, hanyadik képen milyen koordinátákkal rendelkezik (points[photo_id][point_id]={x: 31.324, y: 4534.34}). Ez így szép és jó. Fontos még a dologhoz, hogy elég gyakran használom a tömb minden elemét. És sok benne az olyan elemi, aminek nincs értéke, mert az adott képen az a pont nincs meg, de másik képeken viszont igen.
Eljutottam oda, hogy van 2000 pontom, 100 képem, így a változó elég komoly méretet öltött, Firefox ki is akadt tőle (script stack space quota is exhausted), a többi böngésző még bírja (lassúnak amúgy nem lassú, még a firefox sem, amíg bírta).
Hozzátenném, hogy sose tanultam programozni, autodidakta vagyok, ennek minden hibájával, ezért is fordulok hozzátok.
A kérdés tehát, hogyan lehet a tömb méretét praktikusan csökkenteni, illetve, ha mondjuk képenként külön tömbbe raknám, akkor az segítene-e a firefoxon, vagy valószínűleg a teljes lefoglalt címtér fogyott el számára?
Lehetne továbbá ugye ajax a megoldás, de ahhoz elég sűrűn (~2 másodpercenként) használom a tömböt, hogy ez nem tűnik ideális megoldásnak.
- 1102 megtekintés
Hozzászólások
lehetne azt csinalni, hogy points[photo_id]={point_id: N; x: X; y: Y}, es a point_id -t egyszeruen kikeresed. 2k pontot akar meg sima forciklussal is pillanatok alatt atporgetsz.
Esetleg lehet azt, hogy az epp aktulais kephez (amennyiben ez relevans) "elcacheled" a point_id-kat, mittomen photo_points[point_id] = blah, es onnantol azt hasznalod.
Egy harmadik megoldas lehet AJAX-os, de ez az alkalmazastol fugg: nem pontokat kerdeznel le, hanem adott kep pontjait. Amennyiben a kep aminek a pontjai kellenek, nem valtozik tul surun, akkor meg lehet oldani, hogy szepen behuzod az adott kephez tartozo tombot. Extra josag, hogy ha jol van megcsinalva a dolog, akkor kliens oldalon cachelodik ez, igy nem fogja bongeszo ujra es ujra letolteni, es igy gond nelkul lehet hasznalni ajaxot is.
- A hozzászóláshoz be kell jelentkezni
Állandóan kell az az infó, hogy másik képen az adott pont megtalálható-e, tehát szükségesek a többi kép adatai is valamilyen formában.
Egy olyanon gondolkodom most, hogy mi van ha teljesen kihagyom a tömböket ebből, s az egészet objektumként hozom létre, így kihagyhatom a nem kellő pontok üres adatait. Ebben az esetben viszont szükségem lesz az eval() használatára. Arról meg van egy olyan érzésem, hogy azt illik kerülni optimalizálási szempontból.
- A hozzászóláshoz be kell jelentkezni
Szerintem jo otlet.
Teszteld le, ha nem lassu, akkor a problema meg van oldva =)
- A hozzászóláshoz be kell jelentkezni
"points[photo_id]={point_id: N; x: X; y: Y}"
ez így biztos nem jó, mert ezzel max 1 pontot tudsz képenként letárolni. Én inkább a következőt javaslom:
points[point_id]={photo_id: N; x: X; y: Y}
photopoints[photo_id]=(string, vesszővel felsorolt id-k)
Van ugyan egy kis overheadje, hogy két tömböt is karban kell tartani, viszont jóval kevesebb memóriát eszik, és a pontok kikeresése egy adott képhez is gyors:
//a p lokalis tomb, csak ideiglenesen foglal memoriat, nem folzamatosan
var i,p=photopoints[photo].split(",");
for(i=0;i<p.length;i++) draw(points[p[i]]);
A memóriahasználatára az a jellemző, hogy a points tömbben minden pontnak 1 elem felel meg (nincsenek felesleges üres bejegyzések), a photopointsban meg minden képnek 1 string elem.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, közben megoldódott, de az előtted írt cucc valóban nem volt jó nekem.
Végül az lett hogy:
point[photo_id]={p1:{x,y},p32:{x,y}};
és a hivatkozás rá:
point[photo_id]['p' + i];
Remekül megy, már át is írtam a teljes progit, így gyorsan lehetett is módosítani. És így eszi is már a firefox a cuccomat.
- A hozzászóláshoz be kell jelentkezni
Nem értek a Javascripthez, de programozni tudok. :)
A tárolás módja attól függ, hogyan akarod fölhasználni.
Ha csak végigmész a pontokon, akkor legegyszerűbb, ha csinálsz egy structúrát:
struct {x, y, pic_id, id}, és ezt berakod egy listába.
Olyat is csinálhatsz, hogy struct Point {x, y, id}, ezt berakod egy másikba:
struct TPicPoints ( picture, list }, és a TPicPoints-okat rakod egy listába.
Bocs az egyszerűsített semmilyen nyelvért, remélem tiszta volt a mondandóm.
- A hozzászóláshoz be kell jelentkezni
Kösz!
Ha jól sejtem a struktúra az az objektum akar lenni js-ban, a lista meg egy tömb.
Fölhasználás módja:
folyamatosan rakok le új pontokat, meg változtatok régieket, és ekkor más képeken ugyanezen pont adatait is le kell kérdeznem, és még a képet is gyakran cserélgetem a rendszerben.
- A hozzászóláshoz be kell jelentkezni
points=new Array();
points[0]=new Object();
points[0][0]={ x: 235, y: 32 };
Így egy olyan array-od lesz, amiben egy object-eket tárolsz, aminek a mezőnevei számok; ha az adott photo_id, point_id -hez nem tartozik pont, akkor ahhoz nem is foglalsz memóriát.
- A hozzászóláshoz be kell jelentkezni
Oh, na ez egy jó infó volt, erről nem tudtam, hogy így is lehet az objektum elemeire hivatkozni! és akkor a korábban említett eval() se kell sehol!
Köszönöm!
- A hozzászóláshoz be kell jelentkezni