Che cosa stiamo cercando di fare:
Stiamo cercando di creare un sistema che conterrà il numero di voci uniche per un determinato periodo di tempo. Funziona bene fino a quando i dati crescono o il tempo aumenta, quindi riceviamo qualche OOM Exception o la risposta è troppo lenta.
Per semplificare è più o meno il classico conteggio delle parole ma con i tempi.
# timestamp - userId - count
111111 - 12345 - 1
222222 - 67890 - 1
333333 - 67890 - 1
444444 - 12345 - 1
555555 - 12345 - 1
Se l'utente chiede il "top" tra (100.000,400000) la risposta dovrebbe essere "67890 - 2", altrimenti se chiede il "top" tra (100.000,600000) la risposta dovrebbe essere "12345 - 3" .
Siamo nell'ordine di milioni di voci (da 1 a 10, più o meno).
Cosa abbiamo fatto:
In questo momento stiamo memorizzando i dati su MongoDB, divisi per ore. Ottenere i documenti (che sono abbastanza grandi) è piuttosto lento, circa un minuto per ottenere 168 documenti per una settimana. Abbiamo provato Redis ad accelerare un po 'le cose, ma siamo ancora fuori dal nostro obiettivo.
Che cosa ho provato:
Per sperimentare un po 'ho scritto un file di testo con un paio di milioni di voci (circa 50mb) e ho cercato semplicemente di leggere e contare da esso, filtrando per il timestamp. Sembra essere "incredibilmente" più veloce, circa 2 secondi per passare attraverso tutte le voci.
Lo svantaggio è che, anche per i piccoli intervalli di tempo, dovremmo analizzare tutto il file. Per risolvere questo problema, possiamo pensare di dividere i file ogni giorno.
Ho provato anche Spark, ma per cose così piccole sembra eccessivo e lento.
Ad ogni modo, mi sembra strano che il modo più veloce per farlo sia leggere un file di testo! C'è qualche disegno, quadro che mi manca?
Dichiarazione di non responsabilità: Non sono sicuro se ho esposto il problema abbastanza chiaramente o se è adatto per questo sito, ma sto perdendo il sonno da 3 settimane alle prese con questo e questo sembra essere uno dei miei ultimi scatti.