2012-04-16 15 views
10

Tôi có một databse KDB/Q có khoảng ~ 2 triệu bản ghi mỗi ngày tiêu thụ khoảng ~ 2G bộ nhớ. Vào cuối ngày, nó chạy một số công cụ báo cáo thực hiện kết nối giữa các bảng và xuất kết quả vào các tệp trên đĩa. Trong quá trình tính toán, mức sử dụng bộ nhớ tăng lên ~ 15G. Vấn đề của tôi là một khi hoạt động này kết thúc bộ nhớ không bao giờ được phát hành trở lại và cho đến khi DB được khởi động lại nó tiêu thụ tất cả 15G bộ nhớ.Mức tiêu thụ bộ nhớ KDB/Q

Tôi muốn yêu cầu KDB dỡ bỏ một số bảng khỏi bộ nhớ (không thả chúng), nhưng tôi không muốn khởi động lại DB vì một số ứng dụng khác vẫn đang kết nối với nó.

Có cách nào để yêu cầu KDB dỡ bỏ thứ gì đó khỏi bộ nhớ không?

EDIT:

Nếu có ai tìm thấy nó thú vị, tôi đề nghị để có một cái nhìn vào .Q.gc[] cho KDB 2.5+, trông đầy hứa hẹn.

Trả lời

7

Dưới đây là tổng thành từ các nghiên cứu của tôi:

  • KDB trước ver. 2.5 phân bổ các khối bộ nhớ 64MB khi cần và không bao giờ giải phóng chúng. Nó có thể tái sử dụng chúng mặc dù.
  • phiên bản gần đây KDB phép .Q.gc[] gọi đó là on-yêu cầu gọi để thu gom rác (KDB sử dụng ref. Đếm btw.)
  • điều này đặc biệt hữu ích khi bạn gọi một số bộ nhớ tính toán chuyên sâu mà phân bổ nhiều bộ nhớ (trong trường hợp của tôi nó đã được ~ 20gB) và bạn muốn giải phóng bộ nhớ sau khi tính toán kết thúc.
  • bạn luôn có thể xem xét việc đưa kịch bản bộ nhớ chuyên sâu vào một quá trình Q riêng biệt để bộ nhớ sẽ được phát hành một lần kịch bản kết thúc
4

Đây có thể là hiển nhiên, nhưng ngoài việc kiểm tra các phương thức thu gom rác thải cho phiên bản của bạn của q, hãy đảm bảo rằng bạn đã thực sự loại bỏ dữ liệu trong bộ nhớ đang sử dụng bộ nhớ. Nếu bạn ok với việc thoát khỏi toàn bộ bảng (ví dụ này là một bảng tạm thời tham gia vào việc tính toán), chỉ cần xóa nó khỏi namespace gốc

delete table from`. 

nếu không, bạn có thể xóa tất cả các hàng của nó

delete from`table 
2

Đối với bất cứ ai cố gắng này trong tương lai cách đơn giản nhất đã đến:

  1. Bắt đầu một quá trình KDB mới.
  2. Từ truy vấn quy trình đó để chọn ra các tập hợp dữ liệu giới hạn nhỏ nhất cần thiết.
  3. Thực hiện mọi phép nối/tính toán/ghi vào tệp từ quá trình đó. (cho phép bản gốc thực hiện các yêu cầu xử lý)
  4. Đóng quá trình, giải phóng tất cả bộ nhớ.

Như đã đề cập ở trên, các phiên bản mới hơn của KDB giải phóng bộ nhớ tốt hơn nhưng không hoàn hảo.

Có một bài viết tốt trên trang web công ty chúng tôi rằng chi tiết KDB + Quản lý bộ nhớ: http://timestored.com/kdbGuides/memoryManagement

1

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

tôi đã sử dụng một vài lệnh khác nhau. Miễn là bảng của bạn được lưu trữ trên đĩa trước khi bạn xóa nó, bạn sẽ được OK.

Đây là phiên trước khi tạo bảng.

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

Lệnh này tạo bảng và sau đó lưu nó vào đĩa.

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

Bảng vẫn còn trong bộ nhớ

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

Hãy xóa bỏ biến từ bộ nhớ và rác thu thập.

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

Bây giờ bộ nhớ `đã được giảm xuống mức tương đương với đầu phiên.

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