2012-04-16 28 views
10

Posiadam bazę danych KDB/Q, która ma około ~ 2 mln rekordów dziennie, zużywając około ~ 2G pamięci. Pod koniec dnia uruchamia kilka raportów dotyczących łączenia tabel i wyników wyjściowych na pliki na dysku. Podczas obliczania zużycie pamięci wzrasta do ~ 15G. Mój problem polega na tym, że po zakończeniu tej operacji pamięć nigdy nie zostanie zwolniona i dopóki DB nie zostanie zrestartowana, zużyje wszystkie 15G pamięci.Zużycie pamięci KDB/Q

Chciałbym powiedzieć KDB, aby wyładować niektóre tabele z pamięci (ale nie upuść ich), ale nie chcę restartować DB, ponieważ inne aplikacje wciąż się z nim łączą.

Czy istnieje sposób, aby powiedzieć KDB, aby wyładować coś z pamięci?

EDIT:

Jeśli ktoś uzna za interesujące proponuję rzucić okiem na .Q.gc[] dla KDB 2.5+, wygląda obiecująco.

Odpowiedz

7

Oto suma się z moich badań:

  • KDB przed ver. 2.5 przydziela 64 MB pamięci w razie potrzeby i nigdy ich nie zwalnia. Jest jednak w stanie je ponownie wykorzystać.
  • nowsze wersje KDB pozwalają .Q.gc[] połączenia, który jest na życzenie wezwanie do śmieciarza (KDB używa ref. Licząc btw.)
  • ta jest szczególnie przydatna, gdy powołać jakąś pamięci intensywne obliczenia, które przydziela dużo pamięci (w moim przypadku to było około 20 gB) i chcesz zwolnić pamięć po zakończeniu obliczeń.
  • zawsze można rozważyć wprowadzenie pamięci intensywne skrypt w oddzielnym procesie Q więc pamięć zostanie zwolniony, gdy skrypt zakończy
4

Może to być oczywiste, ale oprócz sprawdzania tryby zbierania śmieci dla swojej wersji q, upewnij się, że rzeczywiście pozbyłeś się danych w pamięci, które korzystają z pamięci. Jeśli jesteś ok z pozbycie się całej tabeli (na przykład jest to tabela temp zaangażowany w obliczeniach), po prostu usunąć z nazw root

delete table from`. 

jeśli nie, można usunąć wszystkie swoje wiersze

delete from`table 
2

dla każdego, kto próbuje to w przyszłości najłatwiej byłoby:

  1. Zacznij nowy proces KDB.
  2. Z tej kwerendy procesu wybierz najmniejsze ograniczone podzbiory danych.
  3. Wykonaj wszystkie połączenia/obliczenia/zapisy do pliku z tego procesu. (pozwalając oryginałowi na przetwarzanie zgłoszeń)
  4. Zamknij proces, zwalniając całą pamięć.

Jak wspomniano na powyższych plakatach nowsze wersje KDB zwalniają pamięć lepiej, ale nie idealnie.

Istnieje dobry artykuł na naszej stronie internetowej spółki, że szczegóły KDB + Zarządzanie pamięci: http://timestored.com/kdbGuides/memoryManagement

1

http://code.kx.com/q4m3/12_Workspace_Organization/#125-expunging-from-a-context

Użyłem kilka różnych poleceń. Dopóki twoja tabela jest przechowywana na dysku przed jej zniszczeniem, powinieneś być w porządku.

To jest sesja przed utworzeniem tabeli.

q).Q.w[] 
used| 290192 
heap| 67108864 
peak| 67108864 
wmax| 0 
mmap| 0 
mphy| 8589934592 
syms| 629 
symw| 20704 

To polecenie tworzy tabelę, a następnie zapisuje ją na dysku.

q)t:([]10000?"ab"; 10000?5) 
q)save `t 
`:t 

Stół jest wciąż w pamięci

q).Q.w[] 
used| 437808 
heap| 67108864 
peak| 67108864 
wmax| 0 
mmap| 0 
mphy| 8589934592 
syms| 629 
symw| 20704 

Załóżmy, wymazać z pamięci zmienną i zbierać śmieci.

q)delete t from `. 
`. 
q).Q.gc[] 
0 

Teraz pamięć "używana" została zredukowana do kwoty podobnej do początku sesji.

q).Q.w[] 
used| 290208 
heap| 67108864 
peak| 67108864 
wmax| 0 
mmap| 0 
mphy| 8589934592 
syms| 630 
symw| 20730 
q)\v 
`symbol$() 
Powiązane problemy