Pereiti prie turinio

Masinis duomenų apdirbimas/atrinkimas


Rekomenduojami pranešimai

Sveiki,

Susidūriau su tokia problema, kad nesugalvoju itin gero sprendimo dideliam duomenų kiekiui apdoroti ( reikia greitai ir kokybiškai ).

 

Manau pradėsiu nuo situacijos aprašymo ir ko man reikia:

Situacija yra tokia - turiu lentelę users, kurioje yra 0,5 mln įrašų. Išgaunu visų šių įrašų e-mail kaip array ( visi yra 100% unikalūs ). ( lentelę vadiname users )

 

Tada turiu failą, kuriame yra tarkime 10k vartotojų, tai yra e-mail, name, lastname, balansas, nuolaida. ( failą vadiname import )

 

Turiu antrą lentelę, kurioje saugau users, kurie priklauso tam tikrai kompanijai pagal kompanijos id, taigi iš ten ištraukiu tarkime dar 50k įrašų. ( lentelė vadiname discounts )

 

Reikia:

Patikrinti ar import esantčio el. pašto users.id nėra discounts lentelėje. Čia reikia atrinkti visiškai visus, kurių toje lentelėje nėra ( kokią php f-ciją geriausia naudoti ar imti kiekvieną import narį ir sukti for ciklą? )

 

Gauname visus narius, kurių nėra discounts lentelėje. Atliekame antrą patikrinimą su users lentele, kuris gali baigtis dviem baigtimis: ( vėl, kaip atskirti du array, kuriuose būtų pvz neegzistuojantys nariai ir egzistuojantys )

1. Users lentelėje el. paštas atrastas, todėl man tereikia įvykdyti insert užklausą į discounts lentelę ( kaip ir viskas aišku, nes vienu metu galiu visus įterpti )

2. Turiu per curl siųsti užklausą į tam tikrą adresą su POST, gauti user ID ir tada įterpti informaciją į discounts lentelę.

 

Realus principas tai yra toks, kad turiu iš import failo išrinkti visus e-mail, kurie nėra užregistruoti į vieną array, bei tuos, kurie yra užregistruoti, tačiau nėra discounts lentelėje su mano company_id...

 

Gal kas nors turite minčių arba bent jau žinote php funkciją, kuri greičiau nei ciklas atrinktų man reikiamus duomenis?

 

Iš anksto ačiū tiems, kurie padės!

 

Edit:

Šiokia tokia schema ko man reikia:

https://docs.google.com/drawings/d/1JZNL0Bkt8a-4TdvobV7ICRJz5yZs4E4kOxS59aZM8-w/edit?usp=sharing

Redagavo ModestasV
Nuoroda į pranešimą
Dalintis kituose puslapiuose

As manau daryciau taip:

 

Pirma import.txt su scriptu uzuploadinciau i atskira lentele duomenu bazeje.

O tada jau darbas su mysql funkcijomis.

 

Inner joins ir if statmentus rasyciau uzklausose mysql, ir atrinktu manau tikrai greiciau negu darant foreach.

 

Kitas variantas butu su ajax daryti tarkim po 1000 tikrinimu vienu metu. Ir tik ivykdzius 1000 inicijuoti sekanti ajax request pradedant nuo 1001 eilutes, ir t.t. Tada niekada nebus timeout.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Gal kas nors turite minčių arba bent jau žinote php funkciją, kuri greičiau nei ciklas atrinktų man reikiamus duomenis?

Nori „ciklo, greitesnio už ciklą“. :) Stebuklų nebūna.

 

Tiesiog masyvas nėra tinkama duomenų struktūra tikrinimui „ar yra narys?“. Nes tada laikas gaunasi O(n). Kadangi tikrini m narių kiekvieną ar yra toje lentelėje, tai O(n*m). Tau reikia "set" (aibės) duomenų struktūros. Kadangi PHP tokios neturi, tai vietoj to pasitarnaus kad ir hashmapas.

$vartotojai = ["[email protected]" => TRUE];

Tada vieno nario esamumo tikrinimas vidutiniu atveju jau yra O(1) veiksmas :)

 

O apskritai, galbūt geriausia būtų tikrai palikti sunkiąją dalį mysql'ui. Sudėjus atitinkamus indeksus (pvz. unikalus email), turėtų greit vaikščioti.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nori „ciklo, greitesnio už ciklą“. :) Stebuklų nebūna.

 

Tiesiog masyvas nėra tinkama duomenų struktūra tikrinimui „ar yra narys?“. Nes tada laikas gaunasi O(n). Kadangi tikrini m narių kiekvieną ar yra toje lentelėje, tai O(n*m). Tau reikia "set" (aibės) duomenų struktūros. Kadangi PHP tokios neturi, tai vietoj to pasitarnaus kad ir hashmapas.

$vartotojai = ["[email protected]" => TRUE];

Tada vieno nario esamumo tikrinimas vidutiniu atveju jau yra O(1) veiksmas :)

 

O apskritai, galbūt geriausia būtų tikrai palikti sunkiąją dalį mysql'ui. Sudėjus atitinkamus indeksus (pvz. unikalus email), turėtų greit vaikščioti.

 

Nenoriu ciklo greitesnio už ciklą :) Galbūt yra tam greitesnis variantas ir tiek, negul sukti foreach ir t.t. :)

 

Iš kitos pusės radom sprendimą - linux programą, kurią iškviečiu su socket ir palieku ją ramiai dirbti kitame serveryje :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nenoriu ciklo greitesnio už ciklą :) Galbūt yra tam greitesnis variantas ir tiek, negul sukti foreach ir t.t. :)

Nu tai sakau. Tu apsibrėži sau duomenų struktūrą - masyvą, nori tikrinti, ar jame yra narys - tai ir yra ciklas, nes turi tikrinti visus narius (nebent koks nors specialus atvejis, pvz., masyvas surikiuotas, tada galima binary search). :) Čia ne PHP funkcijos radimo klausimas, o tinkamos duomenų struktūros. :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...