2013-06-04 11 views
5

Ho un'applicazione C che esegue lo streaming di dati su una tabella di memoria kdb tutto il giorno, superando la dimensione della RAM del mio server. L'obiettivo finale è archiviare i dati su disco, quindi ho deciso di eseguire una funzione di partizione del timer per trasferire i dati gradualmente. Ho trovato questo codice:Come partizionare correttamente una tabella in tempo reale in kdb?

part_timer : { [] 
    (`$db) upsert .Q.en[`$sym_path] select [20000] ts,exch,ticker,side,price,qty,bid,ask from md; 
    delete from `md where i<20000 
} 

.z.ts: part_timer 
.z.zd: 17 2 6i 
\t 1000 

È questo il modo corretto di partizionare i dati di streaming in tempo reale? Come scriveresti questo codice? Sono preoccupato che l'istruzione delete non sia sincronizzata con la selezione.

risposta

3

Pur non essendo una soluzione esplicita al problema. Dai un'occhiata a w.q here. Questa è una sola alternativa di scrittura al tradizionale RDB. Questo buffer richieste e ogni record MAXROWS scrive i dati sul disco.

1

Alla fine della giornata (cioè non ci si aspetta che i dati vengano aggiunti), dal vostro programma C si può chiamare:

Scrivi una posizione per 2013.01.01

.Q.dpft[`:/path/to/location;2013.01.01;`sym;`tableName]; 

Chiaro tavolo

delete from `tableName 

Cancella po 'di memoria fino

.Q.gc peach til system"s" 

Ovviamente si presume che tu abbia colonne time/sym e desideri visualizzare per data. Altrimenti

`:/path/to/location/tableName/ set tableName 

Splay.

Può aggiungere anche, se lo si desidera (vedi IO capitolo del Q per i mortali per gli esempi)

+0

Grazie per le chiamate .Q, le aggiungerò al mio script. Non posso aspettare la fine della giornata per archiviare i dati, ho spiegato nella domanda che il tavolo di memoria supererebbe la nostra RAM installata, quindi sto cercando di archiviare su disco gradualmente. –

+0

Ah, mi sono perso; in tal caso, aggiungere come in w.q come qualcuno ha detto –

+0

È possibile utilizzare .Q.dpft [] per aggiungere righe? Sembra difficile per kdb. In caso contrario, come posso riorganizzare efficacemente il db alla fine della giornata per memorizzare i simboli in sequenza? –

2

Nel commento di cui sopra che hai chiesto:

Se no, come posso riorganizzare il db in modo efficace al fine giornata per memorizzare i simboli in sequenza?

So che questa risposta è un po 'ritardata, ma questo potrebbe aiutare qualcun altro che sta cercando di fare la stessa cosa.

Eseguire il seguente per ordinare i dati su disco (Questo è più lento di tirare in RAM, l'ordinamento e quindi la scrittura su disco):

 par:.Q.par[PATH;.z.D;TABLE]; 
    par xasc `sym; 
    @[par;`sym;`p#]; 

Dove:

PATH: `:path/on/disk/to/db/root; 

per singolo file tabelle:

TABLE: `tableName; 

Per le tabelle strombate:

TABLE: `$"tablename/" 
+0

Questa risposta non è correlata alla domanda originale. Poiché tali casi vengono solitamente cancellati, si prega di considerare l'aggiunta di un riepilogo di questo come commento. – dkar