PHP & databáze

07. 08. 2017 11:43 #53558
medvidekYou
WD Trader: N/A/5

Příspěvky: 4
Registrace: 07.08.2017
Čau,

chci se zeptat jak řešíte XML import ( insert / update / delete ) dat?

Při malém množství dat/produktů nemám absolutně žádný problém a vše probíhá zhruba:

1. načtu všechny parametry / kategorie / produkty do jednotlivých polí ( $db_products , $db_cat, .. )

2. přes XMLReader procházím postupně každý produkt od dodavatele a porovnávám existence ( tzn. prohledávám pole [ $db_products, ...] )

3. pokud je potřeba nějaká akce s produktem, pak ho vložím do jednoho z polí ( $update , $delete, $insert )

4. po projití všech produktů z XMLReaderu, začnu zpracovávat jednotlivé akce po "blocích"
( tzn. např. multi-insert po 10ti,... )



Má otázka zní, lze to udělat nějak lépe? Někteří dodavatelé mají 100k+ produktů a začínám mít s takovým počtem trochu problém ( hlavně s "memory_limitem", ale i "časem zpracování" )


* Přemýšlel jsem, zda by nebylo výhodnější vytvářet SQL soubory ( update, insert, delete ) a po projetí všech dat z XMLReaderu, poslat komplet soubor na zpracování.. ( nejsem si ale jistý jaký by to mělo dopad )


Díky za každý postřech, jak to kdo má řešené :)

08. 08. 2017 17:23 #53562
m1ch3l
WD Trader: 4.62/5

Příspěvky: 335
Registrace: 16.06.2012
* Přemýšlel jsem, zda by nebylo výhodnější vytvářet SQL soubory ( update, insert, delete ) a po projetí všech dat z XMLReaderu, poslat komplet soubor na zpracování.. ( nejsem si ale jistý jaký by to mělo dopad )


Myslíš jako uploadnout data do SQL databáze a tam je zpracovat?

Jak často takto zpracováváš data?

08. 08. 2017 18:29 #53563
medvidekYou
WD Trader: N/A/5

Příspěvky: 4
Registrace: 07.08.2017
Má úvaha ( abych odlehčil trochu paměti ):

- vytvořit 3 soubory - insert.sql / update.sql / delete.sql
- během čtení dat z XMLReaderu přidávat jednotlivá data/produkty do těchto souborů ( klasicky přes file_put_content + append )
* před přidáním bude muset proběhnout důkladná validace dat, aby to pak na nějakém produktu nespadlo

- tím prakticky, budu držet v paměti jen data z DB, nic víc
- po konci procházení promažu všechny pole [ $db_products, ...] a načtu už jen ty 3 sql soubory

** tímhle sem prakticky nic nezrychlil ( naopak si myslím, že zápis do souborů to trochu prodlouží ), ale odlečím znatelně paměti


A ve finále je asi několik možností:
- pokud je dostupnej exec, pak pošlu celej soubor přes příkaz rovnou
- načtu soubor a pak použiju mysqli multi_query ( budu procházet všechny řádky a importovat po blocích nebo celý - nemám ponětí, zda multiquery schroustá třeba 100k insert řádků )
- zkusím mysqli "source ...."

** Bo úvaha, vytvářet Temp tabulky v mysql? Má s tim někdo zkušenosti? Vůbec netuším jaký způsob zpracování dat ( tedy PHP -> MySQL ins/del/upd ) je nejrychlejší.

? Zajímalo by mě, jak to řeší ostatní, např. nějaký větší katalogy/eshopy/ atd.. ( pokud jedou na mysql ), pořád si nejsem jistej, jestli to dělám správně :/


* Zpracovávám je denně

08. 08. 2017 18:47 #53564
m1ch3l
WD Trader: 4.62/5

Příspěvky: 335
Registrace: 16.06.2012
Já jsem třeba zkoušel na localhostu (PC) vytvořit jeden milion řádků. Po propočtu mi vyšlo, že za jednu sekundu se vytvořilo 12 500 řádků. Běželo to na SSD, I5 procesor s taktem 3,2GHz a DDR4 ramky. Takže tak.

Pak jsem zkoušel v tom milionu řádků něco hledat. Přesný čas neřeknu, ale trvalo to pár sekund :)

Víc zkušeností s takovým objemem bohužel nemám.

08. 08. 2017 22:07 #53566
medvidekYou
WD Trader: N/A/5

Příspěvky: 4
Registrace: 07.08.2017
Jasně díky :) kdyby vše chodilo stejně rychle na hostingu jako na localhostu tak by nebyl problem :D ale to bych se asi nedoplatil.

* Zatím nikdo nic, tak to vypadá, že na to asi nejdu zase tak špatně (y) - a nebo s tím nikdo nemá moc zkušeností

09. 08. 2017 02:14 #53567
brooks
WD Trader: N/A/5

Příspěvky: 9
Registrace: 09.05.2017
Pokud máš problém s pamětí, tak neukládej do $update , $delete, $insert polí, ale prováděj změny přímo v iteraci cyklu.
Pokud máš velkej problém s pamětí, neukládej data z databáze do polí, ale získávej je až při iteraci cyklu.

My jsme měli velikej problém s pamětí, výsledkem bylo to, že menší sady dat (kategorie např.) se držely v paměti a data produktů se získávala až při iteraci. Čas běhu je o něco málo delší.

10. 08. 2017 21:59 #53570
medvidekYou
WD Trader: N/A/5

Příspěvky: 4
Registrace: 07.08.2017
Děkuji, popravdě mě to zase až tak nepálí, spíš mě zajímá, jak to řeší jiní ;) protože těch způsobů jak naimportovat XML je vícero

Pro plnohodnotné využívání fóra, vč. psaní příspěvků se musíte registrovat nebo se přihlásit.
Registrovat se nebo Přihlásit se
Kentico