PHP ir SQL > PHP ir SQL - Klausimai ir pagalba

[Klausimas]Kaip dirbti su dideliais XML failais?

(1/2) > >>

ganjabest:
Sveiki, kadangi neradau temos apie didelio kiekio duomenų importavimo iš nutolusio serverio, tai paklausiu. Teko susidurti su nemažu duomenų atnaujinimu(maždaug 500 000k prekių), kasdien. Prekės yra iš keleto failų, todėl sukasi ciklas. Realiai, updeitinant, atsinaujina tik kainos ir kiekis, todėl 1200prekių prasisuka maždaug per 30s.  Pats duomenų nuskaitymas į masyvą trunka vos 5-6s. 5200 prekų. Manau čia išspaudęs viską, ką galėjau. Visas smagumas prasideda kaip nauji(įterpiant visiškai naujus įrašus) duomenys pradedami išsaugoti į duomenų bazę ir atsisiunčiami paveikslėliai. Kalbėsiu apie 5000 prekių kiekį. Su cron'ais lyg ir prasisuka skriptas tol kol įkeliama viskas, bet jeigu bandoma kelti, naudojant naršyklę(paspaudus tarkim import mygtuką), serveris po 5min nutraukia darbą. Nors dar kurį laiką per tą pačią naršyklę viskas buna užlužę, bet vistiek duomenys iki galo nebūna importuojami. 5min yra sesijos galiojimo laikas, kurios aš negaliu keisti, nes serveriai.lt neduoda kitokio.
Realiai man reikalingas šitas rankinis importas pirmam prekių įkėlimui, kad būtų galima peržiūrėti, importo klaidas ir po to ramiai palikti suktis tolimiasniam ciklui.
Įdomu, kaip kiti elgiatės tokioje situacijoje? Ar tiesiog palikti visą darbą cronjob'ams ir nedaryti jokiu rankinių valdymų ar vistik yra išeitis? Buvo mintis skaidyti masyvą dalimis, maždaug išsitenkant į 5min, paskutinius duomenis saugoti į sesiją ir automatiškai vėl užkrauti naują sesija nuo to paskutinio taško, bet man čia nerimta kažkaip.
Dar vienas klausimas būtų dėl cronjob darbo, ar visus duomenis importuojat vienu paklausimu ar skaidote dalimis? Pvz atskirai paveikslėliai ir duomenys? Ar tiesiog bendrai duomenis išskaidot į kelias užklausas?

Lukas:
pirmas dalykas ieskociau kas stabdo ir bandyciau isspresti tai. jei nepavyksta, tada jei yra daugybe action'u, ka reikia padaryti ir viena action'a vykdyti uztrunka pakankamai ilgai ir jei actionas nera priklausomas nuo kito action'o. pvz jei tau reikia procesinti 1 preke ir nesvarbu ka veikia tuo metu kitos prekes, tai gali sudeti visas procesinamas prekes i eile ir tada pakurti worker'ius, kurie vykdo ta eile ir rocesina po viena preke pasieme.

Tokiu budu gali prijungti prie eiles vykdymo dar keleta kompu ir visa eile galima tada ivykdyti labai greitai su pakankamai workeriu, nes gaunasi kad vienu metu vykdosi kelios prekes.

aisku jei skaitai xml faila, kuris uzima tikrai daug ir yra letas jo nuskaitymas, tada tau lagins sudejimas actionu i eile, tai tada dar gali bandyti ji skaityti dalimis ir dalimis kisti i eile.

gearman, rabbitmq

pasiziurek situs queue manager'ius, gal kils minciu.

p.s. pasirupink, kad serve butu SSD hardai, tai turetu pakelti tokiu dalyku greiti. Aisku servo nesitikek papigiai :) https://www.digitalocean.com/pricing/

ganjabest:
Dar kažkaip trumpinti laiką nemanau, kad jau ir galiu. Veiksmų su prekėmis prieš išsaugant keletas yra, nes reikia perfiltruoti kaip kurias reikšmes ir pritaikyti esamos sistemos reikšmėms, po to privalomų laukų čekinimas ir t.t. Bet vistiek iki tol kol prieinama iki updeitinimo į DB ir paveikslėlių download'inmo skriptas net su 10k prekių prasisuka vos per kelias sekundes, o po to jau ant tu pačių 10k dasideda net kelios minutės. Su sql užklausomis nelabai jau irgi yra vietos optimizacijai, nes duomenys keliami į skirtingas lenteles ir kaip kurie duomenys įterpiami tik gavus naujos prekės ar esamos ID, todėl užklausų gaunasi ne viena. Dar daugiau laiko suvalgo paveikslėliai.

Kad ir dabar štai prasukau: http://prntscr.com/5teem9

Prasukta tik duomenų updeitas, be paveikslėlių importo. O su paveikslėliais gaunasi ir 6 ir 8min. Kas labiausia nervina, tai kad užlaužia browserį ir kol nesibaigia, į ta puslapį jokiais budais per tą pačia naršyklę neina patekti. Per kitą, viskas kuo puikiausiai.
Sukant per cronjob'a viskas ok, bet naudoju vieną užlausą ir nuojauta kužda, kad neišnaudoju serverio resursų pilnai. Dabar norint pajungti visas prekes, vienai užklausai reiktų ~3-4h kol visos prekės būtų atnaujintos, tai tas mane labai neramina.
Esu ne vieną kartą matęs, kad duomenų ir paveikslėlių nuskaitymas dar buna atskiriama ir nuskaitoma skirtingomis užklausomis, bet butų įdomu sužinoti realią to naudą.

Aplamai įdomu būtų pasižiūrėti, kaip greitai gali prasisukti dideli kiekiai prekių, tik niekur nerandu, kažkokių atliktų testų, kad galima būtų pasitikrinti.

Lukas:
2000 prekiu yra lasas vandenyne, pagalvok ka darytum, jei turetu ta pati padaryti amazon'o shop'ui kur prekiu yra 200M + prekiu. tikrai nedarytum per browseri kazkoki atnaujinima, suktis manau turi viskas background'e ir butinai buti kazkoks load balanceris jei nori normalaus performance'o. Tai gali padet isspresti gearman ar rabbitmq. Pas mane darbe pvz yra situacija tokia, kad yra milijonai klientu, kurie klikina visokius dalykus: pvz ikelti wordpress'o zip'a ir iskleisti ji i folderi. Padaryti svetaines backup'a, perkelti kazka tarp servu ir t.t. visokie ilgai trunkantys dalykai. tai visi tie "jobs'ai" eina i eile ir juos vykdo laisviausi (tuo metu) workeriai. Kitaip ten viskas luztu.

ganjabest:
gearman ir rabbitmq tikrai geri dalykai, bet kol serveris ribotų galimybių, tai nieko nepadarysiu. Serverio kontrolės pakolkas neturiu jokios, nes naudojamas hostingas. Iškarto aš jiems sakiau, kad mestų lauk tą hostinga ir išsinuomotų normalų serverį ir kol to nesupras turbūt kažką optimizuoti šiuo klausimu, daugiau ir neis.
Nebent dar galima būtų pabandyti pakeisti updeitinimo į DB principą, nes dabar insert'inimui ir update'inimui naudojamos paprastos wordpress'o funkcijos wp_insert_post, wp_set_object_terms, add_post_meta . Ištiesų dar nebandžiau to pakeisti tiesiog į paprastas užlausas naudojant $wpdb funckijas, nes tos wordpress'o funkcijos turi savybę žiauriai apkrauti skriptą. Išėmus 1 funkciją ir pakeitus ją custom parašyta, kelis kartus kodas pagreitėjo. Na o su paveikslėliais, tai jau čia nieko neprižaisiu daugiau.
Ateityje, didėjant prekių skaičiams, kažkokius worker'ius, tai verkiant reikia daryti, bet dabar dar manau išsisuksiu ir taip, tiesiog užsimojau daryti kas neįmanoma, tai importuoti per browserį didelius kiekius.

Navigacija

[0] Žinučių sąrašas

[#] Sekantis puslapis

Eiti į pilną versiją