2013-07-21 35 views
15

Trong ứng dụng của tôi, tôi sử dụng từ điển (hỗ trợ thêm, xóa, cập nhật và tra cứu) cả hai khóa và giá trị đều có thể được tạo tuần tự. đồ thị đối tượng lớn). Tôi đã đến một điểm khi từ điển trở nên quá lớn mà giữ nó hoàn toàn trong bộ nhớ bắt đầu thỉnh thoảng kích hoạt OutOfMemoryException (đôi khi trong các phương pháp từ điển, và đôi khi trong các phần khác của mã).Một từ điển có thể lưu các phần tử của nó được truy cập ít thường xuyên hơn vào đĩa

Sau khi cố gắng thay thế hoàn toàn từ điển bằng cơ sở dữ liệu, hiệu suất giảm xuống mức không thể chấp nhận.

Phân tích các mẫu sử dụng từ điển cho thấy thường một phần nhỏ hơn giá trị "nóng" (được truy cập thường xuyên) và phần còn lại (phần lớn hơn) "lạnh" (hiếm khi truy cập hoặc không bao giờ). Thật khó để nói khi một giá trị mới được thêm vào nếu nó sẽ nóng hoặc lạnh, hơn nữa, một số giá trị có thể di chuyển qua lại giữa các bộ phận nóng và lạnh theo thời gian. Tôi nghĩ rằng tôi cần thực hiện một từ điển có thể xóa các giá trị lạnh của nó vào một đĩa trên một sự kiện bộ nhớ thấp, sau đó tải lại một số yêu cầu và giữ chúng trong bộ nhớ cho đến khi sự kiện bộ nhớ thấp tiếp theo. xảy ra khi trạng thái nóng/lạnh của chúng sẽ được đánh giá lại. Lý tưởng nhất, việc thực hiện nên điều chỉnh gọn gàng kích thước của các bộ phận nóng và lạnh của nó và khoảng thời gian xả tùy thuộc vào hồ sơ sử dụng bộ nhớ trong ứng dụng để tối đa hóa hiệu suất tổng thể. Bởi vì một số trường hợp của một từ điển tồn tại trong ứng dụng (với các khóa/giá trị khác nhau), tôi nghĩ rằng, chúng có thể cần phải phối hợp quy trình công việc của chúng.

Bạn có thể đề xuất cách triển khai từ điển như vậy không?

+5

Bạn có nghĩ về việc thêm bộ nhớ cache vào phương pháp tiếp cận db không? Tôi nghĩ rằng bộ nhớ cache chuẩn với thời gian hết hạn trượt có thể cải thiện hiệu suất. – empi

Trả lời

0

Chỉ cần một ý tưởng - không bao giờ làm điều đó và không bao giờ sử dụng System.Runtime.Caching:

Thực hiện một wrapper xung quanh MemoryCache mà sẽ:

  1. Thêm mục có một callback đuổi quy định. Cuộc gọi lại sẽ đặt các mục bị gỡ bỏ vào cơ sở dữ liệu.
  2. Lấy mục từ cơ sở dữ liệu và đưa trở lại vào MemoryCache nếu mục không có trong MemoryCache trong khi truy xuất.
  3. Nếu bạn mong đợi rất nhiều yêu cầu cho các mục bị thiếu cả trong cơ sở dữ liệu và bộ nhớ, có thể bạn sẽ cần triển khai bộ lọc nở hoặc bộ nhớ cache cho các mục hiện tại/thiếu.
0

Tôi có vấn đề tương tự trong quá khứ.

Khái niệm bạn đang tìm kiếm là bộ nhớ cache đã đọc với hàng đợi LRU (Ít nhất được sử dụng gần đây nhất hoặc được sử dụng gần đây nhất).

Is it there any LRU implementation of IDictionary?

Khi bạn thêm điều cần từ điển của bạn theo dõi mà những nơi sử dụng gần đây nhất, loại bỏ chúng khỏi bộ nhớ và tồn tại những vào đĩa.

2

Biên dịch 64 bit, triển khai trên 64 bit, thêm bộ nhớ. Giữ nó trong bộ nhớ.

Trước khi bạn tự trồng, bạn có thể xem WeakReference http://msdn.microsoft.com/en-us/library/ms404247.aspx. Dĩ nhiên nó sẽ đòi hỏi bạn phải xây dựng lại những đồ vật đã được khai hoang, nhưng người ta nên hy vọng rằng những đồ vật được khai hoang không được sử dụng nhiều. Nó đi kèm với báo trước rằng các hướng dẫn riêng của nó có thể tránh sử dụng các tham chiếu yếu như một giải pháp tự động cho các vấn đề quản lý bộ nhớ.Thay vào đó, hãy phát triển một chính sách lưu bộ nhớ đệm hiệu quả để xử lý các đối tượng của ứng dụng của bạn.

Tất nhiên bạn có thể bỏ qua hướng dẫn đó và làm việc hiệu quả mã của bạn để giải thích.

Bạn có thể triển khai chính sách lưu vào bộ nhớ cache và khi hết hạn lưu vào cơ sở dữ liệu, trên tìm nạp và bộ nhớ cache. Sử dụng một thời hạn trượt tất nhiên kể từ khi bạn đang quan tâm đến việc giữ những người sử dụng nhiều nhất.

Tuy nhiên, hãy nhớ rằng hầu hết được sử dụng nhiều nhất so với nặng nhất là giao dịch. Mất một đối tượng 10 lần một ngày mà mất 5 phút để khôi phục sẽ làm phiền người dùng nhiều hơn mất một đối tượng 10000 lần mà công cụ chỉ 5ms để khôi phục.

Và ai đó đã đề cập đến bộ nhớ cache trên web. Nó thực hiện quản lý bộ nhớ tự động với callbacks như đã lưu ý, phụ thuộc vào nếu bạn muốn lug rằng một trong những xung quanh trong các ứng dụng của bạn.

Và ... cuối cùng nhưng không kém phần quan trọng, hãy xem bộ nhớ cache được phân phối. Với sharding bạn có thể chia nhỏ từ điển đó trên một vài máy.

Các vấn đề liên quan