Tôi có một ứng dụng mà toàn bộ cơ sở dữ liệu được thực hiện trong bộ nhớ bằng cách sử dụng một bản đồ stl cho mỗi bảng trong cơ sở dữ liệu.Cách tối ưu hóa phân trang cho lớn trong cơ sở dữ liệu bộ nhớ
Mỗi mục trong sơ đồ stl là một đối tượng phức tạp có tham chiếu đến các mục khác trong các bản đồ stl khác.
Ứng dụng hoạt động với một lượng lớn dữ liệu, do đó, nó sử dụng hơn 500 MByte RAM. Khách hàng có thể liên hệ với ứng dụng và nhận phiên bản được lọc của toàn bộ cơ sở dữ liệu. Điều này được thực hiện bằng cách chạy qua toàn bộ cơ sở dữ liệu và tìm các mục có liên quan cho khách hàng.
Khi ứng dụng đã chạy trong một giờ hoặc lâu hơn, Windows 2003 SP2 sẽ bắt đầu trang ra các phần của RAM cho ứng dụng (Mặc dù có RAM 16 GB trên máy).
Sau khi ứng dụng đã được phân trang một phần thì đăng nhập của khách hàng mất một thời gian dài (10 phút) vì bây giờ nó tạo ra lỗi trang cho từng tra cứu con trỏ trong bản đồ. Nếu chạy máy khách đăng nhập lần thứ hai ngay sau đó thì nó nhanh (vài giây) vì tất cả bộ nhớ giờ đã trở lại trong RAM.
Tôi có thể thấy rằng có thể yêu cầu Windows khóa bộ nhớ trong RAM, nhưng điều này thường chỉ được đề xuất cho trình điều khiển thiết bị và chỉ dành cho bộ nhớ "nhỏ".
Tôi đoán một giải pháp mans nghèo có thể là lặp qua toàn bộ cơ sở dữ liệu bộ nhớ, và do đó cho Windows biết chúng tôi vẫn quan tâm đến việc giữ datamodel trong RAM.
Tôi đoán một giải pháp người nghèo khác có thể là vô hiệu hóa tệp trang hoàn toàn trên Windows.
Tôi đoán giải pháp tốn kém sẽ là cơ sở dữ liệu SQL, sau đó viết lại toàn bộ ứng dụng để sử dụng lớp cơ sở dữ liệu. Sau đó, hy vọng hệ thống cơ sở dữ liệu sẽ thực hiện có nghĩa là để truy cập nhanh.
Có các giải pháp thanh lịch nào khác không?
Ứng dụng chạy dưới dạng dịch vụ Windows nhưng vẫn có cửa sổ bảng điều khiển (Sử dụng AllocConsole). Tự hỏi nếu Windows phản ứng với cửa sổ giao diện điều khiển này được giảm thiểu, và sau đó quyết định cắt bộ làm việc. –
Cũng nhận thấy rằng nhiều bộ đệm làm việc được phân bổ bằng cách sử dụng mới hoặc malloc nhưng không sử dụng kích thước chunk đồng nhất (Đây là một ứng dụng cũ). Bằng cách điều chỉnh kích thước phân bổ có thể chia cho 1024, sau đó nó giảm một nửa các byte ảo cho ứng dụng. –
Bây giờ đã sử dụng ProcDump để đăng ký dấu vết ngăn xếp khi nó đã rất bận rộn. Nó tiết lộ rằng nó đã dành rất nhiều thời gian cho nhiều hoạt động mới/malloc lớn. Bây giờ đã thực hiện tái sử dụng bộ đệm tốt hơn, nhưng tôi vẫn còn bối rối tại sao đăng nhập máy khách đầu tiên cần thời gian, và lần thứ hai nó nhanh. –