[Megoldva] javascript iszonyat méretű tömb

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.

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.

Á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.

"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.

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.

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.

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.

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.