ciao a tutti, ho una domanda nuova![]()
secondo voi per cercare dati dentro un GROSSO archivio .csv è meglio un sistema di ricerca sequenziale o binaria?
ovviamente intendo con php e in relazione alla velocità di esecuzione.
ciao,
jack.
ciao a tutti, ho una domanda nuova![]()
secondo voi per cercare dati dentro un GROSSO archivio .csv è meglio un sistema di ricerca sequenziale o binaria?
ovviamente intendo con php e in relazione alla velocità di esecuzione.
ciao,
jack.
è una follia ricercare dentro un csv ...[supersaibal]Originariamente inviato da mdsjack
ciao a tutti, ho una domanda nuova![]()
secondo voi per cercare dati dentro un GROSSO archivio .csv è meglio un sistema di ricerca sequenziale o binaria?
ovviamente intendo con php e in relazione alla velocità di esecuzione.
ciao,
jack. [/supersaibal]
cmq devi andare per forza sul sequenziale, non hai chiavi
tranne che mantieni tu un indice esterno che ti gestisca i campi di ricerca e quindi accelera tutto tremendamente![]()
The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand
pensavo al sistema binario è proprio per evitare indici.
il csv sarebbe ordinato in ordine crescente proprio nel campo "indice", a cui poi corrisponde un valore.
un sistema ad indice esterno sai dirmi quanto fa guadagnare a grandi linee?
TANTO
xche?
dipende da come lo fai
se ad esempiofai un file di questo tipo ...
[HEADER]
1BYTE[CHAR]4BYTE[UINT]4BYTE[UINT]
.
.
.
.
.
[CHIAVI]
nBYTE[CHAR()]4BYTE[UINT]1BYTE[CHAR-SEPARATORE]
e fai 256 blocchi di questi ... e nel primo byte inserisci il primo carattere del valore che devi cercare ... sai all'instante da dove iniziare (per vedere dove leggere nella testata del file è estremamente semplice ... 9 * valore ascii del carattere)
il valore unsigned int (devi sprintfarlo con %u senno lo hai signed in php) contiene la posizione iniziale di quei valori , mentre il secondo uint contiene la posizione finale ... semplicemente estrai quel blocco di dati e lo splitti in base ad un separatore che hai precedentemente stabilito ... a questo punto hai un array, piccolo rispetto alle dimensioni complessive, dell'indice ... usi ad es un ciclo while ... e appena trovi il valore che ti interessa leggi gli ultimi 4 byte ed estrai la riga ... e poi apri il CVS ... ed estrai (devi leggere carattere per carattere, in ogni caso dato che devi scomporti, tramite un parser, il contenuto del CSV) fino all'accapo finale
in questo modo ... puoi anche avere 1 milione di righe dentro il cvs ... ma la velocità di ricerca è ESTREMAMENTE alta![]()
The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand
il bello è che quando mi spieghi qualcosa, io capisco il 20%.![]()
cmq grazie. per adesso lascio il sequenziale e addio al binario.![]()
LOL
guarda che è semplice ... ci sono, MAX, fatto bene, 2 giorni di lavoro ^^
The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand
dico un'ovvietà: ovviamente il file deve essere ordinato per i valori tra cui devi cercare, sennò la ricerca binaria è inutile![]()
beh ... in realtà no[supersaibal]Originariamente inviato da skidx
dico un'ovvietà: ovviamente il file deve essere ordinato per i valori tra cui devi cercare, sennò la ricerca binaria è inutile[/supersaibal]
usando un file indice non ha importanza l'ordinamento
al max ti può accelerare un po ... ma se usi il sistema che ho descritto su, lo speedup è minimo))
The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand
sbav, ma continuo a non capirci niente.
non sono un informatico...![]()
Daniele, se usi un file indice ordinato, la ricerca binaria la fai sull'indice, non sul file, ma sempre ordinato deve essere quello su cui cerchi.[supersaibal]Originariamente inviato da daniele_dll
beh ... in realtà no
usando un file indice non ha importanza l'ordinamento[/supersaibal]
Per la ricerca binaria, ovunque tu la faccia, i valori da cercare devono essere ordinati, sennò è perfettamente inutile, conviene fare una sequenziale.