 |
www.vincenzomanzoni.com Homepage personale e blog di Vincenzo Manzoni
|
Precedente :: Successivo |
Autore |
Messaggio |
Giorgio Utente adulto


Registrato: 08/01/04 19:19 Messaggi: 1793 Residenza: Sedrina (Bergamo)
|
Inviato: Lun Nov 03, 2008 11:15 am Oggetto: Problema... |
|
|
Ho una domanda da porre ad ingegneri informatici e non.
Ho una tabella di un database che possiede pi� di 4 milioni di record e per accedervi velocemente ho creato una serie di indici: funziona perfettamente.
Ora per� ho un problema. Lo spazio occupato � troppo grande, perci� volevo sapere se conoscevate una maniera alternativa per poter accedere ai dati, ad esempio utilizzando un file binario o qualcosa del genere...
Ogni record della tabella possiede molti campi (circa una ventina), potrei eliminarne molti, ma lo spazio occupato rimane troppo grande. Mi serve una soluzione differente, che mi permette di avere uno spazio di memoria occupata molto pi� basso ed allo stesso tempo un accesso veloce ai dati.
Qualche idea? _________________ Nessuno potr� viver la mia vita al posto mio, per quanto mi identifichi nel battito di un altro, sar� sempre attraverso questo cuore... - Jovanotti, "Mezzogiorno"
-- My site |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Lun Nov 03, 2008 12:07 pm Oggetto: Re: Problema... |
|
|
Giorgio ha scritto: | Ora per� ho un problema. Lo spazio occupato � troppo grande, perci� volevo sapere se conoscevate una maniera alternativa per poter accedere ai dati, ad esempio utilizzando un file binario o qualcosa del genere... |
Ci dai qualche dettaglio in pi�? Per esempio, sono gli indici o i dati che occupano tanto spazio? Qual � l'ordine di grandezza?
Sembra un problema interessante.  |
|
Top |
|
 |
Giorgio Utente adulto


Registrato: 08/01/04 19:19 Messaggi: 1793 Residenza: Sedrina (Bergamo)
|
Inviato: Lun Nov 03, 2008 12:11 pm Oggetto: Re: Problema... |
|
|
vinz ha scritto: | Ci dai qualche dettaglio in pi�? Per esempio, sono gli indici o i dati che occupano tanto spazio? Qual � l'ordine di grandezza? |
No no il problema � il grande numero di dati, non gli indici.
Beh, lo spazio occupato credo che sia intorno ai 900 Mbyte, compresso per�...
A me basterebbe avere un file con poche informazioni per ogni record, non tutte quelle presenti nel DB. L'importante � che occupi poco spazio e che abbia un accesso veloce. Se l'accesso non fosse cos� veloce potrei pensare di indicizzare il tuttoper� non so quanto convenga, dovrei fare un po' di prove. _________________ Nessuno potr� viver la mia vita al posto mio, per quanto mi identifichi nel battito di un altro, sar� sempre attraverso questo cuore... - Jovanotti, "Mezzogiorno"
-- My site |
|
Top |
|
 |
Pastacolpesto Utente adolescente


Registrato: 19/05/04 18:47 Messaggi: 730 Residenza: Bergamo
|
Inviato: Lun Nov 03, 2008 2:01 pm Oggetto: |
|
|
900 Mega per 4 milioni di record? Ma sei sicuro?
Che db �?
Comunque se non ti servono tutte le informazioni ti consiglio di farti un'altra tabella con sole le informazioni che ti servono, sicuramente la cosa � pi� veloce.
Che tipo di query dovresti fare?
Io non l'ho mai usato, ma se � SQl server c'� un tool che mentre fai un po' di query cerca di trovare una fantomatica esecuzione ottima della query piazzando indici qua e l�. L'hai provato? _________________ La teoria � quando si sa tutto e niente funziona. La pratica � quando tutto funziona e nessuno sa il perch�. Noi abbiamo messo insieme la teoria e la pratica: non c'� niente che funzioni... e nessuno sa il perch�..
A.Einstein |
|
Top |
|
 |
Tomaux Utente adulto


Registrato: 12/08/04 17:56 Messaggi: 2494 Residenza: bergamo
|
Inviato: Lun Nov 03, 2008 4:07 pm Oggetto: |
|
|
Imparati le informazioni a memoria! _________________ A volte mi fermo e penso:
"THE EARTHQUAKE!!! OH MY FUCKING GOD, THE EARTHQUAKE!!!"
|
|
Top |
|
 |
Francesco Utente adulto


Registrato: 23/12/03 15:24 Messaggi: 2113 Residenza: Busnago (MI)
|
Inviato: Lun Nov 03, 2008 8:22 pm Oggetto: |
|
|
A mio parere, e per quello che ho studiato di db, il fattore occupazione su disco vs. velocit� di accesso � un trade off, ovvero aumenti la velocit� aumentando gli indici e quindi lo spazio occupato e viceversa, non � che puoi scappare tanto lontano da questo...
Non vorrei dire stupidate, ma mi sembra di ricordare che il para o qualche esercitatore all'epoca ci avesse detto che i db pi� veloci e speed-critical usano anche il 90% dello spazio occupato solo per gli indici!
Come consiglio ti direi di ridurre all'osso i campi, tanto per iniziare, quindi cercare se esiste qualcosa che ti permetta di comprimere in maniera trasparente all'utilizzatore i dati del db, inoltre controllare se esistono dati ridondanti e se ad esempio una diversa struttura potrebbe migliorare le cose. Se hai query statiche e predefinite anche un'ottimizzazione delle query potrebbe essere una via percorribile.
Infine dopo che hai rimpicciolito il tutto, ti metti a smanettare con gli indici fino a quando raggiungi la dimensione limite che vuoi avere. Cos� a naso ti direi che probabilmente puoi indicizzare in modo "custom" sulle tue query, sempre che siano statiche ovviamente, ovvero individuare qual'� l'operazione pi� dispendiosa che esegue la tua query e cercare di lavorare su quell'aspetto, quest'ultima cosa me la sono appena inventata, non sono affatto sicuro che sia una strada percorribile nella pratica! _________________ God is real........... unless declared integer or long |
|
Top |
|
 |
Giorgio Utente adulto


Registrato: 08/01/04 19:19 Messaggi: 1793 Residenza: Sedrina (Bergamo)
|
Inviato: Mar Nov 04, 2008 10:19 am Oggetto: |
|
|
Allora, come gi� avevo detto la riduzione dei campi non � un problema, non tutte le informazioni presenti sono necessariamente utili.
Grazie per i vostri consigli, ma a me interessa avere una soluzione alternativa all'utilizzo di un DB... Se esiste. Cio� un file con un formato particolare o qualcosa di simile, dove posso scrivere gli stessi dati presenti nel DB (anzi molti meno). _________________ Nessuno potr� viver la mia vita al posto mio, per quanto mi identifichi nel battito di un altro, sar� sempre attraverso questo cuore... - Jovanotti, "Mezzogiorno"
-- My site |
|
Top |
|
 |
Francesco Utente adulto


Registrato: 23/12/03 15:24 Messaggi: 2113 Residenza: Busnago (MI)
|
Inviato: Mar Nov 04, 2008 11:18 am Oggetto: |
|
|
XML? CSV? Per� l'accesso a questi file � sequenziale, quindi dovresti scorrere sempre tutto e con milioni di record.... ci metti anni... non so, magari esistono metodi di accesso alternativi, magari no...  _________________ God is real........... unless declared integer or long |
|
Top |
|
 |
Giorgio Utente adulto


Registrato: 08/01/04 19:19 Messaggi: 1793 Residenza: Sedrina (Bergamo)
|
Inviato: Mar Nov 04, 2008 11:41 am Oggetto: |
|
|
Francesco ha scritto: | XML? CSV? Per� l'accesso a questi file � sequenziale, quindi dovresti scorrere sempre tutto e con milioni di record.... ci metti anni... non so, magari esistono metodi di accesso alternativi, magari no...  | Potrei indicizzarli ed accedere all'indice, ma speravo che qualcuno di voi conoscesse soluzioni alternative ... _________________ Nessuno potr� viver la mia vita al posto mio, per quanto mi identifichi nel battito di un altro, sar� sempre attraverso questo cuore... - Jovanotti, "Mezzogiorno"
-- My site |
|
Top |
|
 |
abaddon Utente adulto


Registrato: 05/04/04 16:32 Messaggi: 2033
|
Inviato: Mar Nov 04, 2008 7:47 pm Oggetto: |
|
|
4milioni di righe su file � da suicidio che sia xml o meno o_o
francamente non ho ben capito il problema all'inizio pensavo che volevi ottimizzare il db, ora parli di metodi alternativi per memorizzare le cose...
a sto punto se effettivamente � cos� il consiglio di Fede non � male, nel senso, selezioni le cose che ti interessano e ti ricrei un db customizzato con i dati che ti interessano e quello grosso lo "butti".
Potresti guardare anche i tipi di dato da utilizzare, infatti a seconda del tipo di dato che hai cambia la dimensione es:
char=1 byte int=4 byte; long=4 byte (prese al volo da un sito, spero siano giusti perch� francamente non mi ricordavo pi� )
comunque il discorso � che se usi un campo char per scrivere 10000 hai usato 5byte se usavi un int ne usavi 4byte e lo stesso il contrario, se hai numeri piccoli allora forse ti conviene salvarli come char cos� usi 1 byte invece di 4 byte costanti... perdendo ovviamente gli operatori anche se volendo potresti usare alcuni comandi tipo CAST o CONVERT per castare i dati al volo a livello di query (in SQLSERVER ci sono sti comandi perch� li ho usati recentemente, penso anche negli altri DB medio alti)
boh queste sono le cose che mi vengono in mente, poi ci sarebbe da leggere qualche enciclopedia sulla gestione dei dati presumo... |
|
Top |
|
 |
Andrea Moderatore

Registrato: 23/12/03 13:10 Messaggi: 5200
|
Inviato: Mar Nov 04, 2008 9:04 pm Oggetto: |
|
|
XML � da spararsi... |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Mar Nov 04, 2008 10:38 pm Oggetto: |
|
|
Giorgio, secondo me dovresti specificare meglio i requisiti. Puoi usare o no un database? Perch� se s�, la soluzione migliore � quella di fare una analisi delle tabelle attuali, fare una proiezione sugli attributi che ti sevono, costruirci sopra degli indic furbi (hash o BTree a seconda) e poi usare SQL per le query.
Difficilmente puoi, con moderato sforzo, fare meglio di un db in termini di velocit�.
Se invece non puoi usare un db, devi per forza usare un file binario. A questo punto ti devi creare due file: uno che contiene i dati e uno che contiene gli indici ai dati. All'avvio, carichi in memoria solo il contenuto dell'indice, sull'indice fai le interrogazioni e quindi accedi al file con le informazioni.
Personalmente, non vedo altre alternative.  _________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
Giorgio Utente adulto


Registrato: 08/01/04 19:19 Messaggi: 1793 Residenza: Sedrina (Bergamo)
|
Inviato: Mer Nov 05, 2008 12:18 pm Oggetto: |
|
|
vinz ha scritto: | Personalmente, non vedo altre alternative.  | Ok, a quanto sembra non ci sono soluzioni migliori a quelle che gi� conoscevo...
Comunque sia, pensavo di essere stato chiaro. Mi ripeto: il DB che possiedo � molto grande ed occupa un sacco di spazio, ma l'accesso ai suoi dati l'ho reso molto veloce grazie all'utilizzo di indici. Per diminuire lo spazio basta che mi creo un DB identico ma con meno campi per ogni record, e fin qui ok... Mma a questa conclusione c'ero gi� arrivato.
Io volevo sapere se esisteva una alternativa all'utilizzo di un DataBase...
Giorgio ha scritto: | volevo sapere se conoscevate una maniera alternativa per poter accedere ai dati, ad esempio utilizzando un file binario o qualcosa del genere... | Da quanto mi avete detto, l'unico sistema che conoscete � proprio l'utilizzo del file binario, perci� nulla che non conoscevo gi�... Peccato  _________________ Nessuno potr� viver la mia vita al posto mio, per quanto mi identifichi nel battito di un altro, sar� sempre attraverso questo cuore... - Jovanotti, "Mezzogiorno"
-- My site |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Mer Nov 05, 2008 2:43 pm Oggetto: |
|
|
Dato che 900 MB non sono poi "moltissimi" , potresti pensare di caricarli prima in memoria e poi accederci direttamente. In questo caso, devi crearti tu una struttura che li contenga, allocare lo spazio in memoria in maniera dinamica (malloc o new) e poi crearti una struttura ad indice (magari ti basta solo un hash) per andare a "prenderli". _________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
Giorgio Utente adulto


Registrato: 08/01/04 19:19 Messaggi: 1793 Residenza: Sedrina (Bergamo)
|
Inviato: Mer Nov 05, 2008 4:21 pm Oggetto: |
|
|
vinz ha scritto: | Dato che 900 MB non sono poi "moltissimi" , potresti pensare di caricarli prima in memoria e poi accederci direttamente. In questo caso, devi crearti tu una struttura che li contenga, allocare lo spazio in memoria in maniera dinamica (malloc o new) e poi crearti una struttura ad indice (magari ti basta solo un hash) per andare a "prenderli". | Mmh... Si giusto, non so esattam come fare, per� in effetti caricandoli in memoria avrei un accesso pi� veloce. _________________ Nessuno potr� viver la mia vita al posto mio, per quanto mi identifichi nel battito di un altro, sar� sempre attraverso questo cuore... - Jovanotti, "Mezzogiorno"
-- My site |
|
Top |
|
 |
|
|
Non puoi inserire nuovi argomenti Non puoi rispondere a nessun argomento Non puoi modificare i tuoi messaggi Non puoi cancellare i tuoi messaggi Non puoi votare nei sondaggi
|
|