2013-06-04 9 views
5

Mam aplikację C, która przesyła dane do tabeli pamięci kdb przez cały dzień, ostatecznie przerastając rozmiar mojej pamięci RAM serwera. Ostatecznie celem jest przechowywanie danych na dysku, dlatego postanowiłem uruchomić funkcję partycji czasowej, aby stopniowo przesyłać dane. Wpadłem na ten kod:Jak prawidłowo podzielić tabelę w czasie rzeczywistym w 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 

Czy to właściwy sposób na podział danych strumieniowych w czasie rzeczywistym? Jak napisałbyś ten kod? Obawiam się, że instrukcja delete nie jest zsynchronizowana z select.

Odpowiedz

3

Nie jest to jednoznaczne rozwiązanie problemu. Spójrz na w.q here. Jest to alternatywa tylko do zapisu tradycyjnego RDB. To buforuje żądania, a każdy rekord MAXOWS zapisuje dane na dysk.

1

Na koniec dnia (to znaczy nie należy się spodziewać, że dane mają być dołączone), z programu c można nazwać:

Napisz do lokalizacji dla 2013.01.01

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

Wyczyść tabela

delete from `tableName 

Usunąć niektóre pamięć się

.Q.gc peach til system"s" 

Oczywiście zakładano, że masz kolumny czasu/symu i chcesz je przeglądać według daty. W przeciwnym razie

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

Splay.

można dołączyć również, jeśli chcesz (patrz IO rozdział Q dla śmiertelników na przykładach)

+0

Dzięki za wywołania .Q, dodam je do mojego skryptu. Nie mogę się doczekać końca dnia na przechowywanie danych, wyjaśniłem w pytaniu, że tabela pamięci przerośnie naszą zainstalowaną pamięć RAM, więc staram się przechować na dysku stopniowo. –

+0

Ah tęskniłem; w takim przypadku dopisz jak w w.q, jak ktoś powiedział: –

+0

Czy możliwe jest użycie .Q.dpft [] do dołączania wierszy? Brzmi trudno dla kdb. Jeśli nie, w jaki sposób mogę efektywnie zreorganizować db na koniec dnia, aby sekwencyjnie przechowywać symbole? –

2

W powyższym komentarzu pan zapytał:

Jeśli nie, w jaki sposób można skutecznie zreorganizować dB przy koniec dnia do sekwencyjnego przechowywania symboli?

Wiem, że ta odpowiedź jest nieco opóźniona, ale może to pomóc komuś, kto próbuje zrobić to samo.

Uruchom następujące posortować dane na dysku (jest wolniejszy niż pociągnięcie go do pamięci RAM, sortowania, a następnie pisemnie na dysku):

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

Gdzie:

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

Dla pojedynczego pliku tabele:

TABLE: `tableName; 

Na stołach rozstawione:

TABLE: `$"tablename/" 
+0

Ta odpowiedź nie jest związana z pierwotnym pytaniem. Ponieważ takie przypadki są zwykle usuwane, rozważ dodanie podsumowania tego jako komentarza. – dkar

Powiązane problemy