Applicazione intensiva computazionale: caricamento e interrogazione del database

7

La mia azienda ha una suite di maturità (le radici risalgono a più di 15 anni), applicazioni computazionalmente intensive (simulazioni) che usiamo per svolgere attività di consulenza. Lavoro sul lato della simulazione / consulenza della casa, non sul lato dello sviluppo del software. Recentemente ho appreso di una particolare caratteristica dell'architettura che mi riguarda: il nostro grande (200-500 MB, a volte più) i dati di input sono prima completamente caricati in memoria dal database. Quindi, il motore di simulazione accede ai dati di input dalla memoria mentre continua.

Mi è sembrato un "ottimizzazione pre-matura" e / o un'idea vecchio stile, poiché ritengo che ci siano server di database là fuori che possono essere abbastanza veloci. L'architettura causa un altro problema, ovvero il nostro database di simulazione può essere così grande (poco più di un GB) prima che un sim non possa essere eseguito affatto. Il capo architetto è uno scienziato, non uno sviluppatore di software, e un po 'testardo, quindi sto cercando commenti su questa domanda dalla comunità.

La nostra architettura ci ferisce? Ci sono documenti / lavoro / test sull'argomento, trade-off tra la lettura del database e una copia del database in memoria? Qualsiasi commento o intuizione sarebbe apprezzato. Mi piacerebbe essere istruito prima di risolvere il problema con la mia azienda.

    
posta Pete 05.05.2011 - 16:32
fonte

4 risposte

2

Is our architecture hurting us?

No.

Are there any papers/work/test on the subject-- tradeoffs between database reading as-you-go and a database copy in memory?

Sì. Centinaia.

Questo è il motivo per cui i database nascondono le cose. Più il database è in memoria più velocemente funziona il database.

Tutti gli algoritmi di caching intelligente (LRU, ecc.) sono progettati per ottenere prestazioni piuttosto buone con un uso abbastanza buono della memoria. Per un prodotto di database generico, questo può comportare alcuni compromessi interessanti.

Per la tua applicazione, tuttavia, mettere tutto in memoria è chiaramente ottimale. Non c'è compromesso. Hai già raggiunto il limite massimo del rendimento.

Any comments or insight would be appreciated.

Sostituire la tua memoria all-in con qualsiasi altra cosa può comportare più I / O e quindi essere più lento.

Ci sono alcune cose che puoi fare se vuoi accelerare le cose.

  1. Non caricare file in un database e quindi eseguire query sul database per creare la struttura in memoria. Basta caricare i file in memoria. Molto più veloce.

  2. Se possibile, interrompi l'elaborazione per creare una pipeline a livello di sistema operativo in cui vengono letti i risultati parziali da stdin e i risultati vengono scritti su stdout. Una serie di stadi della pipeline userà più core e più memoria, spesso portando a un miglioramento del throughput.

risposta data 05.05.2011 - 16:50
fonte
6

Un database in memoria ha il potenziale per essere più veloce di uno su un disco rigido. Ci sono anche opzioni per fare una miscela.

Indipendentemente da ciò, ci sono molti altri fattori che potrebbero eliminare l'opzione del disco rigido. Suggerirei di lasciare che il capo architetto si occupasse dell'architettura (sarà duro se cerchi di fare il suo lavoro). Invece, concentrati sulla limitazione delle dimensioni e sul piano aziendale. Portagli il problema (devi simulare set di dati più grandi di 1 GB) e fagli capire una soluzione.

    
risposta data 05.05.2011 - 16:42
fonte
4

Non sono un esperto in questa particolare area, ma non riesco a vedere nulla che batte l'approccio "in memoria". Sì, hai il lento avvio del caricamento di tutti quei dati, ma una volta lì il tuo tempo di recupero dei dati è fondamentalmente 0. Se stai eseguendo il database su qualcosa di diverso dalla stessa macchina della simulazione, introduci la latenza di rete nell'equazione.

Senza una vera comprensione dei dati e di ciò che si sta simulando e in che modo, questo suggerimento può o non può valerne la pena. È possibile caricare grandi blocchi di dati alla volta, ad esempio caricare 100 MB / X righe di dati, avviare l'elaborazione e quindi avere i successivi 100 MB pronti per essere elaborati entro la fine del primo lotto.

    
risposta data 05.05.2011 - 16:42
fonte
3

Il problema è che è necessario lavorare con set di dati superiori a 1 GB. Per fare questo, dovrai suddividere i dati in blocchi più piccoli e più gestibili. Quindi il tuo problema principale sarà se gli algoritmi possono lavorare su dati parziali o no.

Se richiedono che tutti i dati vengano letti in memoria, sarà necessario eseguire una grande riscrittura dell'applicazione per modificarlo. Dovrai essere in grado di leggere un sottoinsieme del processo di dati che poi ripetere finché tutti i dati non vengono elaborati. Una volta elaborata ogni parte, dovrai combinare i risultati.

Non è così semplice come cambiare il modo in cui leggi i dati dal database.

    
risposta data 05.05.2011 - 16:43
fonte

Leggi altre domande sui tag