Forum » Programiranje » [VB] ogromno povezav
[VB] ogromno povezav
korenje3 ::
Mogoče vprašanje za loooooooookata.
V mojem programčku, ko ga poženem bi rad da se mi za vsakega uporabnika v tabeli poveže na lasten ip naslov. ker bolj malo poznam VB, sem naredil tako da se mi poveže tako da prečekira tabelo na vsake toliko časa in se pri vseh nepovezanih začne povezovat. Amak to naredi naenkrat, zato se mi recimo pri 100 povezavah blokira programček za 0,5s na vsake toliko časa ko pač prečekira vse rowe. pa ni važno ali to počne v background workerju ali ne, saj ratujejo špice pri porabi procesorskega časa.
zato bi rad vstavil timerje, ki bi se vstavili v lokalno bazo podatkov vsakič ko prebere row iz mysql baze ali pa ko ga ročno dodam. tako bi dobil nek časovni zamik v nekaj desetinkah sekunde, ki bi tako razporedil porabo procesorja čez čas. ti timerji bi pač stalno čekirali če je povezan ali ni.
kako bi to lahko naredil?
V mojem programčku, ko ga poženem bi rad da se mi za vsakega uporabnika v tabeli poveže na lasten ip naslov. ker bolj malo poznam VB, sem naredil tako da se mi poveže tako da prečekira tabelo na vsake toliko časa in se pri vseh nepovezanih začne povezovat. Amak to naredi naenkrat, zato se mi recimo pri 100 povezavah blokira programček za 0,5s na vsake toliko časa ko pač prečekira vse rowe. pa ni važno ali to počne v background workerju ali ne, saj ratujejo špice pri porabi procesorskega časa.
zato bi rad vstavil timerje, ki bi se vstavili v lokalno bazo podatkov vsakič ko prebere row iz mysql baze ali pa ko ga ročno dodam. tako bi dobil nek časovni zamik v nekaj desetinkah sekunde, ki bi tako razporedil porabo procesorja čez čas. ti timerji bi pač stalno čekirali če je povezan ali ni.
kako bi to lahko naredil?
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
darkkk ::
Sleep v funkcijo, ki jo izvaja bg worker? Ne razumem te sicer 100% kaj bi rad naredil, ampak naceloma za vsakega nepovezanega daj 100ms sleep
Zgodovina sprememb…
- spremenil: darkkk ()
korenje3 ::
Sem zdej videl da lahko dam eventhandler na database.
Tako da sem naredil tole.
AddHandler datasetu.Tables("users").RowDeleting, New DataRowChangeEventHandler(AddressOf Row_Deleted)
AddHandler datasetu.Tables("users").TableNewRow, New DataTableNewRowEventHandler(AddressOf Row_NewRow)
pri vsakem dodanem rowu potem sam dodam timer v objekt ki ga zapišem v celico in to je to.
Fora je v tem, da če delam vse povezave naenkrat mi to preobremeni procesor. zadev kot so sleep med povezavami pa bi se rad izognil, zato bom attachal timer za vsako povezavo posebej. Upam da zmore ta reč 100 timerjev brez kakih problemov :p
Tako da sem naredil tole.
AddHandler datasetu.Tables("users").RowDeleting, New DataRowChangeEventHandler(AddressOf Row_Deleted)
AddHandler datasetu.Tables("users").TableNewRow, New DataTableNewRowEventHandler(AddressOf Row_NewRow)
pri vsakem dodanem rowu potem sam dodam timer v objekt ki ga zapišem v celico in to je to.
Fora je v tem, da če delam vse povezave naenkrat mi to preobremeni procesor. zadev kot so sleep med povezavami pa bi se rad izognil, zato bom attachal timer za vsako povezavo posebej. Upam da zmore ta reč 100 timerjev brez kakih problemov :p
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Zgodovina sprememb…
- spremenil: korenje3 ()
Looooooka ::
psevdo logika, ki jo ponavadi uporabljam jaz, ko obstaja moznost, da bo veliko povezovanja...
poberes podatke iz baze(po moznosti v batchih, da ravno ne delas s 10000 zapisi naenkrat) potem v neko listo zapises koga, na kaksen nacin zelis obvestiti o cem... (ip naslov, podatki...what ever).
preden dodas te podatke v listo listo seveda lockas oz synclockas v vb-ju). dodas v listo in v bazi oznacis oz zbrises(da ti pac naslednji batch ne pobira istih recordov).
ko naredis to preveris ce timer(in tega imas samo enega), ki bo obdelal to listo tece...ce ne ga pac zazenes (to spet naredis v okviru nekega locka...).
znotraj samega eventa, ki se sprozi s timerjem pa potem :
zalockas tisto listo. poberes ven toliko zapisov kot jih mislis naenkrat obdelati. potem enega za drugim (ali pa 5 na enkrat...to moras sam ugotoviti kaj je performancno se sprejemljivo) obdelas(se pravi se povezes na ip in posljes karkoli zelis poslati).
potem zalockas tabelo in preveris ce ima se kaj zapisov. ce jih nima lahko timer ugasnes(znotraj svojega locka omenjenega zgoraj).
ce ne pac pustis in bo naslednjiv event v timerju poskrbel za ostale zapise v listi.
zakaj lockanje prvo list in seveda se tiste logike za ugasanje?
1)ne laufas timerja za brezveze(optimizacija je optimizacija ) in timerja ponesreci NE ugasnes, ko se ravno dodajo novi zapisi.
s tako cheap logiko lahko mirno obdelas na tisoce recordov in notifikacij klientov brez, da bi prislo do nekega besnega zmrzovanja.
Ce bos dal pa vsaki notifikaciji svoj timer se bo to definitivno poznalo na resoursih. Ce nic drugega poglej v taskbaru svoj program in bos opazil, da stevilo "threadov" v aplikaciji raste. Prav tako poraba spomina(seveda se vmes tudi sprosti ko se konca...razen ce nimas se kaksnega memory leaka ampak vseeno. Med tem ko te zadeve stojijo se kuri ram). In ce nimas ravno 1024 jedrnika zadeva pac ne bo nic hitreje opravljena. Samo kuri resourse.
Ampak again...to je spet odvisno od stevila povezav. Ce jih manj lahko mirno prezivis z "connect to all at once" logiko pa ne bo nobenih problemov :)
poberes podatke iz baze(po moznosti v batchih, da ravno ne delas s 10000 zapisi naenkrat) potem v neko listo zapises koga, na kaksen nacin zelis obvestiti o cem... (ip naslov, podatki...what ever).
preden dodas te podatke v listo listo seveda lockas oz synclockas v vb-ju). dodas v listo in v bazi oznacis oz zbrises(da ti pac naslednji batch ne pobira istih recordov).
ko naredis to preveris ce timer(in tega imas samo enega), ki bo obdelal to listo tece...ce ne ga pac zazenes (to spet naredis v okviru nekega locka...).
znotraj samega eventa, ki se sprozi s timerjem pa potem :
zalockas tisto listo. poberes ven toliko zapisov kot jih mislis naenkrat obdelati. potem enega za drugim (ali pa 5 na enkrat...to moras sam ugotoviti kaj je performancno se sprejemljivo) obdelas(se pravi se povezes na ip in posljes karkoli zelis poslati).
potem zalockas tabelo in preveris ce ima se kaj zapisov. ce jih nima lahko timer ugasnes(znotraj svojega locka omenjenega zgoraj).
ce ne pac pustis in bo naslednjiv event v timerju poskrbel za ostale zapise v listi.
zakaj lockanje prvo list in seveda se tiste logike za ugasanje?
1)ne laufas timerja za brezveze(optimizacija je optimizacija ) in timerja ponesreci NE ugasnes, ko se ravno dodajo novi zapisi.
s tako cheap logiko lahko mirno obdelas na tisoce recordov in notifikacij klientov brez, da bi prislo do nekega besnega zmrzovanja.
Ce bos dal pa vsaki notifikaciji svoj timer se bo to definitivno poznalo na resoursih. Ce nic drugega poglej v taskbaru svoj program in bos opazil, da stevilo "threadov" v aplikaciji raste. Prav tako poraba spomina(seveda se vmes tudi sprosti ko se konca...razen ce nimas se kaksnega memory leaka ampak vseeno. Med tem ko te zadeve stojijo se kuri ram). In ce nimas ravno 1024 jedrnika zadeva pac ne bo nic hitreje opravljena. Samo kuri resourse.
Ampak again...to je spet odvisno od stevila povezav. Ce jih manj lahko mirno prezivis z "connect to all at once" logiko pa ne bo nobenih problemov :)
Zgodovina sprememb…
- spremenilo: Looooooka ()
Looooooka ::
Tist del, kjer znotraj timerja poberes recorde in zacnes z dejanskim povezovanjem pa lahko mirno zalaufas paralelno (waitone in podobne resitve). Bo seveda hitreje koncalo ce bos 4 povezave na razlicne kliente zagnal paraleno. Vse skupaj lepo posyncas z WaitHandlerji in je to to.
Manj kurjena spomina, pa se tista jedra majo kaj za delat.
Manj kurjena spomina, pa se tista jedra majo kaj za delat.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [VB.NET] classOddelek: Programiranje | 721 (628) | korenje3 |
» | [VB] datagridviewOddelek: Programiranje | 1934 (1317) | korenje3 |
» | DataView, DataTable, DataSetOddelek: Programiranje | 1155 (906) | detroit |
» | [VB] Komunikacija s serijskimi napravamiOddelek: Programiranje | 2299 (1573) | mNeRo |
» | Akcije nad grafiko v VBOddelek: Programiranje | 1265 (1078) | damijani |