È possibile copiare i contenuti di un database nella memoria di un programma, se più query richiedono tempo?

1

L'attività:
Ho un database con 4 tabelle con 200 righe, 800 righe, 50 righe e 30 righe rispettivamente.
Giusto per semplificarlo, supponiamo che le tabelle siano queste serie:
A = [Ar1, Ar2, Ar3], B = [Br1, Br2], C = [Cr1, Cr2, Cr3], D = [Dr1, Dr2, Dr3, Dr4], dove Ar1 significa riga1 della tabella A.

C'è anche una quinta tabella "E" con 250 righe che contiene alcune informazioni che sono rilevanti per le tabelle A , B , C e D .

Per ogni combinazione di AB , ABC e ABCD , sono obbligato a controllare tutte le righe di E per vedere se c'è qualche informazioni rilevanti per la combinazione e memorizzare un conteggio delle informazioni pertinenti. Il conteggio verrà infine scritto in una tabella SQL.

Ad esempio: le combinazioni di AB potrebbero essere:
{Ar1, Br1}, {Ar1, Br2}, {Ar2, Br1}, {Ar2, Br2}, {Ar3, Br1}, {Ar3, Br2}
Quindi devo controllare

forAllRowsOfE
{    
if (row 1 of E == content of Ar1 and row1 of E <= content of Br1) then {var Ar1Br1++;}
}

ed esegui il ciclo sopra per tutte le altre combinazioni di A e B. Quindi eseguilo anche per combinazioni di ABC (per le quali sarebbe {Ar1, Br1, Cr1}, {Ar2, Br1, Cr1} .. .e così via ... e per combinazioni di ABCD).

La dimensione:
Il numero totale di combinazioni per le tabelle A, B, C e D arriva fino a 200 * 800 * 50 * 30 = 240 milioni .

Il problema:
L'esecuzione di 240 milioni di query * 5, anche se occorrono 0,01 per query, impiegherà 138 giorni per essere eseguita. I tavoli sono piccoli ora. Mi aspetto che crescano molto più grandi.

Mi è stato consigliato di caricare queste tabelle nella memoria di un programma Java e di eseguire il calcolo in Java, perché molte delle combinazioni di conteggio di AB verranno ripetute nelle combinazioni di ABC, quindi molta forza bruta il conteggio può essere evitato. L'altro motivo è che tutti questi dati potrebbero essere contenuti in 6 GB di RAM e, quando le dimensioni aumentano, potremmo cercare altre tecniche come la scrittura temporanea su una tabella di database, ecc.

Le domande:

  • Ma la domanda principale è, è davvero più praticabile / più veloce eseguire tali operazioni nella memoria Java?
  • L'utilizzo di cicli nidificati è davvero il modo migliore per affrontare questo o ci sono altre tecniche / domande?
posta Nav 16.02.2016 - 17:27
fonte

2 risposte

4

"Is it viable to copy contents ... into a program's memory"

"vitale"? Certo, la tecnica si chiama cache e sono sicuro che ne hai sentito parlare. Tuttavia, dovresti investire alcuni pensieri in cose come

  • è la memoria disponibile per intero, nell'ambiente di produzione, in esclusiva per il tuo programma?

  • cosa succederà quando le dimensioni della tabella cresceranno, come hai detto? Ad esempio, puoi dividere efficacemente i dati in porzioni che possono essere elaborate in memoria contemporaneamente?

Sarà più veloce di altri approcci? Non c'è altro buon modo se non provare questo e misurare, dipende da un mucchio di cose che non conosciamo, e forse alcune cose anche se non lo sai ancora. Si consiglia di iniziare con un set di dati più piccolo ed estrapolare.

Tuttavia, l'invio di 1,2 miliardi di query singole non sembra troppo promettente e, come regola generale, fare cose "in memoria" è in genere molto più veloce di fare "cose equivalenti" su un supporto di archiviazione esterno, con un gestione del database in mezzo. A seconda del tipo di query, puoi provare a utilizzare le funzionalità di indicizzazione del tuo database, che potrebbero migliorare le cose da quella parte. D'altra parte, se l'indicizzazione è possibile nel database, anche l'uso di hash / dizionari potrebbe essere possibile in memoria.

Dopo aver letto il tuo commento, la memorizzazione dei risultati mi sembra un candidato per un collo di bottiglia. Anche se puoi interrogare i dati completi di queste cinque tabelle AE in meno di un secondo, esegui l'elaborazione principale completamente in memoria, e risulta essere più veloce di qualsiasi altro approccio ti venga in mente, devi finalmente creare questi 240 milioni di file, che richiederà del tempo. Cose da considerare qui:

  • quando fai cose "in memoria", vuol dire che dovrai inviare i dati su una rete (potenzialmente lenta) al server del database? O usi qualcosa come un database locale, dove il programma + db si trova sulla stessa macchina?

  • il traffico di rete presunto diventa un problema: che ne è dell'utilizzo di stored procedure per ridurre il traffico di rete? Che ne dici di usare un enorme JOIN sui tavoli A, B, C, D, E con qualche funzione aggregata? Hai provato quanto bene funziona?

  • quando si esegue l'elaborazione non in memoria, significa che sono necessarie 240 milioni di operazioni INSERT, seguite da 240 milioni * di operazioni UPDATE? Potrebbe rallentare.

  • o la preelaborazione in memoria ti consentirà di trovare prima i risultati e poi di trasferirli "tutto-in-una volta" al database utilizzando una sorta di meccanismo di inserimento in blocco?

Tuttavia alla fine, in memoria o meno, si riduce al database specifico disponibile, alla rete, all'hardware, a molti dettagli dell'attività e all'implementazione scelta, nulla che possa essere valutato qui senza sapere la "cosa reale".

    
risposta data 16.02.2016 - 18:31
fonte
0

For every combination of AB, ABC and ABCD, I'm required to check all rows of E to see if there is some information relevant to the combination, and store a count of the relevant info. The count will be eventually written into an SQL table.

In realtà, questo suona (per me) più come un lavoro per il database da fare, senza riportare nulla nell'applicazione client!

Sei "ogni riga combinata con l'altro" è un Join Cartesiano (o Cross-Product) e generalmente dovrebbe essere evitato a causa dell'enorme [enorme] numero di tuple che può generare ma, in questo caso, dici esplicitamente che è quello che vuoi, quindi dai al tuo database molti (e molti) lotti di memoria e spazio di swap (e una nuova tazza di tè bollente) e lascialo andare.

    
risposta data 17.02.2016 - 12:55
fonte

Leggi altre domande sui tag