Newsgroup: it.comp.www.php
Titolo: Popolare Db con milioni di records

Ho un grosso problema da risolvere e vorrei avere le vostre opinioni in
merito.
Ho 11 files csv contenenti complessivamente 7/8 mil. di records per 42,5
Mb complessivi (mediamente 5/7Mb cadauno).
I dati contenuti sono strutturati in modo molto semplicie, è un'unica
immensa colonna di 8 valori alfanumerici (es: AA659842)
Ho creato una funzione con fgetcsv() che estrapola ogni riga presente
nel file associandola ad un valore numerico specifico per ogni file, la
riga risultante viene poi inserita nel Db (es: "AA659842","200").
 
Tutto ciò servirà successivamente solo per verificare l'esistenza di
quel valore alfanumerico in quell'elenco, e a null'altro.
In pratica l'utente inserisce il codice e il sistema restituisce il
valore se esiste.
Da notare che i files CSV presenti sul sito sarebbero già utilizzabili
così, perchè ogni file ha nel nome il valore a cui fanno riferimento i
dati in esso contenuto.
 
Ovviamente, data l'enorme mole di dati il server APACHE smette di
rispondere dopo circa 50.000 righe se uso PHP.
Caricando direttamente il file SQL in MySQL è il Db che blocca tutto
dopo circa 100.000 righe.
 
Ora credo che altre vie per procedere possano essere solo due, ditemi
voi:
 
1) splitto l'array di dati in porzioni da 10/50.000 righe e poi le
carico una dopo l'altra.
Problema: tutte le volte che il ciclo finisce devo rileggere il file,
andare all'ultima riga inserita e ricominciare il ciclo oppure posso
mantenere tutto in un buffer e far ripartire il senza rileggere il
tutto?
 
2) volendo posso modificare i files come xml, potrei utilizzare le
funzioni di php per simulare il Db da filesystem? Con questi numeri ho
l'impressione che sia un lavoro posente.
 
Consigli? 
 
Grazie
Max
-- 
http://www.maxori.it
 
L'Arte è la capacità di fare cose di nessun valore
e di riuscire a venderle
F. Zappa

 l'impressione che sia un lavoro posente.
 
L'XML aggiungerebbe solo peso all'elaborazione. Il csv è enormemente più 
veloce.
 
Le alternative sono:
 
- farlo da php-cli, che non ha time-limit di nessun tipo (e non hai i 
timeout di apache). naturalmente solo se hai accesso al server in qualche 
modo. Oppure lo lanci in background e ti fai segnalare in qualche modo 
che ha finito (file temporaneo, valore in db, ecc.)
 
- usare gearman per lanciare un lavoro in background. Più o meno simile 
alla soluzione precedente, solo con meccaniche diverse.
 
Bye.

 Consigli? 
 
Prova la tua funzione da riga di comando, eviti il timeout del WebServer e dovrebbe funzionare
 
J


tutto?
 
Nessuna delle due. Anziche' rileggere il file, ci fai una seek.
 
Leonardo
 
-- 
What would'st thou do, my squire so gay, that rides beside my reine
Were ye Glenallan's Earl this tide, and I were Roland Cheyne?
To turn the rein were sin and shame, to fight were wondrous peril:
What would ye do now, Roland Cheyne, were ye Glenallan's Earl?

 faccio un refresh della pagina passando un parametro allo stesso script,
 
Dimenticavo: se usi InnoDB e gli indici, segui questo (sotto Bulk Data 
Loading)
 
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html
 
 
Bye.

 refresh che a caricare dati. :)
 
Anche a me è parsa la più adatta come soluzione.
Ho visto che con PHP riesco a popolare sempre almeno 50.000 righe circa
arrivare al timeout, mi va bene anche meno.



Ma usare load data infile?
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
 
 
-- 
I fatti mi cosano