[ mmix @ 19.09.2011. 20:55 ] @
Treba da isprojektujem jedan sistem koji ce raditi paralelizovano procesiranje gomile inputa, gde broj redova varira od 1 do vise desetina miliona, i na kraju radi neku agregaciju. Poenta je da se simulacija/agregacija obavlja vise puta nad istim setom za razlicite pocetne globalne parametre (citaj baja tweakuje parametre dok mu agregacija ne da odgovarajuce rezultate) i akcent se baca na performanse da baja ne bi potrosio vise vremena nego sto mora. Vec sam preradio procese tako da se koraci simulacije enkapsuliraju pa su postali zgodni za paralelizaciju i sva agregacija se obavlja on-the-fly tokom simulacije; efektivno sam ta dva procesa spojio u jedan i minimizovao broj pristupa podacima ali i dalje imam potencijalni problem sa performansama za veoma velike setove podataka. Radi se u C#-u ali pretpostavljam da ce tehnika koju trazim biti univerzalnije prirode, pa sam okacio ovde.

Dakle, cilj mi je da minimizujem broj HDD I/O operacija maksimalno koristeci raspolozivu memoriju i malo mi se vec muti u glavi :) pa sam otvoren za savete. Best case scenario mi je da je sve in memory to je naravno nemoguce za veoma velike steove ali posle toga best case mi je da za svaki red imam maksimalno jedan read i jedan write (posto rezultat simulacije mora nazad u bazu, u lokalu podaci idu kroz SQL COmpact bazu) tako da mi je locality vazan i ne bih hteo da SQL Compact dropuje page iz memorije pre nego mu vratim update da bih iskoristi i to kesiranje. Bonus je i da u memoriji zadrzim sto je vise moguce kesiranih redova u svojim POCO objektima da bi sledeci simulation run poceo direktno sa kesiranim podacima (ako u memoriju stane N redova to mi je vec N manje read oepracija za sledeci run). Problem mi je kako da adaptivno uklopim sve to, tj kako da sistem integrisem sa windows memory managerom tako da odustanem od dalje alokacije na vreme (jer ako preteram pocece da swapuje stranice iz memorije sto ce bespotrebno usporiti proces). Ima li neko ideju ili konkretan primer kako se ta integracija radi da ne izmisljam toplu vodu?

Podrazumeva se da je sistem vec maksimalno otperecen van aplikacije u trenutku njenog startovanja (nema nijedan dodatni konkurentni proces koji agresivno konkureise za memoriju) ali ako sistem moze da se adaptira i na to to bi bio ekstra bonus.
[ Mihajlo Cvetanović @ 20.09.2011. 09:50 ] @
Uvedi neku promenljivu u konfiguraciju koja kaže koliko memorije treba prealocirati, i onda na produkcionoj mašini podešavaj tu vrednost dok ne budeš zadovoljan rezultatom.
[ mmix @ 20.09.2011. 10:51 ] @
Nazalost, bice vise produkcionih masina sa razlicitim hardverskim konfiguracijama pa je taj posao jalove prirode, treba mi sto ej moguce bolje resenja ali samo-regulisano.

A dal bi funkcionisao sistem da odredim neki free threshold, tipa 10% ukupne memorije i da tokom alokacije pratim instrumentaciju i slobodnu fizicku memoriju i kad kad slobodna memorija padne ispod thresholda obustavim dalju alokaciju i predjem na recikliranje? Ako padne ispod pola thresholda krenem sa dealokacijom?

Mislim da je ovo u principu klasicni sistem kesiranja koji primenjuje OS za low-priority kes (tipa HDD kes) ali nigde ne mogu da nadjem detaljnije objasnjenje kako taj sistem kesiranja adaptivno reaguje na pritisak na memoriju. Ima li nesto slicnu u lindza svetu a da je iole dokumentovano?

[Ovu poruku je menjao mmix dana 20.09.2011. u 12:17 GMT+1]