DB in memoria per eseguire intersecazioni su sezioni di insiemi

2

Ho una necessità di programmazione specifica in cui ho bisogno di archiviare in modo efficiente grandi serie ordinate in memoria, interrogarle per intervalli e intersecarli con altri set che sono anche interrogati per ranged.

Sto guardando Redis, ma non riesco a vedere un comando slice range. MongoDB può usare solo 1 indice, quindi deve eseguire scansioni a livello di riga, mentre io desidero elaborare utilizzando le colonne intersecate.

Sto anche guardando Counchbase, ma non posso facilmente determinare dalla documentazione se è adatto a questo. So che usa Memcached, che è AFAIK non adatto a questo uso.

Qualcuno potrebbe condividere potenziali soluzioni per questo specifico problema?

Modifica Ad esempio, ho bisogno di eseguire quanto segue:

Ottieni gli ID di tutte le auto in cui il prezzo è compreso tra 2000 e 3000 e intersecano tutte le auto in cui la cilindrata è compresa tra 3000 e 4000.

    
posta IamIC 08.07.2012 - 15:49
fonte

1 risposta

1

Java fornisce Treemap . In quella lingua, avrei messo le auto in una mappa con chiave per prezzo e una in base alla taglia del motore. Tira il set desiderato da uno dei "tavoli" e inseriscilo in una collezione facilmente ricercabile. (Una TreeMap, TreeSet o HashSet potrebbe fare.) Quindi scansionare l'intervallo desiderato dell'altro Treemap e vedere quali delle sue auto sono nella tua collezione ricercabile. (Oppure potresti eseguire retainAll() contro la tua collezione ricercabile, passandogli il sottoinsieme di automobili desiderato dall'altra raccolta, ma controlla che il codice Sun / Oracle sia veloce quanto qualsiasi cosa tu scriveresti.)

C # sembra avere tutti i pezzi per fare anche questo. Opzioni infinite, infatti. (Ma è più difficile indovinare l'efficienza). Mi aspetterei che le altre lingue abbiano lo stesso. Se siano meglio di Redis sarebbe una domanda. In effetti, potresti essere in grado di utilizzare i trucchi di Java Collections Framework con Redis.

Nota: in memoria, una ricerca lineare lineare potrebbe non richiedere troppo tempo, soprattutto se i dati si trovano in una matrice, una raccolta basata su array o una sorta di elenco collegato. Potrebbe non valerne la pena di essere elegante.

Dovrai fondere le strutture dati che usi per questa soluzione con qualsiasi altra cosa tu stia facendo in memoria.

    
risposta data 09.07.2012 - 16:37
fonte

Leggi altre domande sui tag