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?