Come meglio unire / ordinare / sfogliare tonnellate di matrici JSON?

2

Ecco lo scenario: supponi di avere milioni di documenti JSON memorizzati come file di testo. Ogni documento JSON è un array di oggetti "activity", ognuno dei quali contiene un attributo "created_datetime". Qual è il modo migliore per unire / ordinare / filtrare / pagina attraverso queste attività tramite un'interfaccia utente web? Ad esempio, diciamo che vogliamo prendere alcune migliaia di documenti, unirli in un gigantesco array, ordinare l'array con l'attributo "created_datetime" che scende e quindi sfogliare 10 attività alla volta.

Ricorda inoltre che circa il 25% di questi documenti JSON viene aggiornato ogni giorno e che gli aggiornamenti devono essere inseriti nella visualizzazione entro 5 minuti.

Il mio primo pensiero è quello di analizzare tutti i documenti in una tabella RDBMS e quindi sarebbe solo una semplice query come "selezionare il nome principale 10, created_datetime da Activity where user_id = 12345 order by created_datetime desc".

Alcuni hanno suggerito di usare invece tecniche NoSQL come hadoop o map / ridurre. Come funzionerebbe esattamente?

Per ulteriori informazioni, vedi: Perché NoSQL è migliore per questo scenario ?

    
posta Infin8Loop 05.02.2013 - 19:55
fonte

1 risposta

1

Come unire / ordinare / pagina attraverso un'enorme quantità di dati?

Bene, per l'ordinamento, guarda Quicksort se i dati sono più o meno randomizzati, o Timsort se è molto ordinato . (Quicksort degenera facilmente in prestazioni orribili su dati altamente ordinati.)

Per la fusione, esiste un algoritmo piuttosto semplice per questo: confronto degli elenchi.

  • Prendi due liste, elenca A ed elenca B. Ordina entrambi gli elenchi usando gli stessi criteri.
  • Dichiara due iteratori che fanno riferimento a un singolo elemento dell'elenco, uno per ogni elenco. Inizializzali per fare riferimento al primo elemento dei rispettivi elenchi.
  • Ripeti
    • Confronta l'elemento di riferimento A (eA) con l'elemento di riferimento B (eB)
    • Se eA < eB gestirà quindi eA in modo appropriato e incrementerà iteratore-A
    • else se eB < eA poi eB opportunamente e incrementa iteratore-B
    • else gestisce il caso di uguaglianza in modo appropriato e incrementa entrambi gli iteratori
  • fino a quando un iteratore raggiunge la fine del suo elenco.
  • (facoltativo) Gestisci gli elementi rimanenti nell'altro elenco, se necessario

Questo concetto di base può essere utilizzato per un numero di operazioni che coinvolgono due elenchi, inclusa la fusione, specificando i casi "gestisci appropriatamente". In questo caso, il modo appropriato per gestirlo è aggiungere un elemento all'elenco di output.

Per il paging, lascia che il tuo motore di database gestisca questo.

    
risposta data 05.02.2013 - 20:07
fonte

Leggi altre domande sui tag