Tôi có một computing map (với soft values) mà tôi đang sử dụng để lưu vào bộ nhớ cache kết quả của việc tính toán tốn kém.Bản đồ máy tính: giá trị tính toán trước thời hạn
Bây giờ tôi có một tình huống mà tôi biết rằng một khóa cụ thể có thể sẽ được tìm kiếm trong vài giây tới. Chìa khóa đó cũng đắt hơn tính toán nhiều nhất.
Tôi muốn tính toán giá trị trước, trong chuỗi ưu tiên tối thiểu để khi giá trị cuối cùng được yêu cầu, nó sẽ được lưu trong bộ nhớ cache, cải thiện thời gian phản hồi.
một cách tốt để làm là gì này như vậy mà:
- tôi có thể kiểm soát các chủ đề (đặc biệt ưu tiên của nó), trong đó việc tính toán được thực hiện.
- Tránh làm việc trùng lặp, tức là tính toán chỉ được thực hiện một lần. Nếu nhiệm vụ tính toán đang chạy thì chuỗi gọi đợi đợi nhiệm vụ đó thay vì tính toán lại giá trị (
FutureTask
thực hiện điều này. Với bản đồ tính toán của Guava, điều này là đúng nếu bạn chỉ gọiget
nhưng không phải nếu bạn trộn nó với các cuộc gọi tớiput
.) - Phương pháp "giá trị tính toán trước" không đồng bộ và không có giá trị. Nếu một tính toán đã được tiến hành, nó sẽ trở lại ngay lập tức mà không cần đợi tính toán đó kết thúc.
- Tránh đảo ngược ưu tiên, ví dụ: nếu chuỗi có mức độ ưu tiên cao yêu cầu giá trị trong khi luồng ưu tiên trung bình đang làm điều gì đó không liên quan nhưng nhiệm vụ tính toán được xếp hàng đợi trên chuỗi có mức độ ưu tiên thấp, thì chuỗi chủ đề ưu tiên cao không được bỏ đói. Có lẽ điều này có thể đạt được bằng cách tạm thời tăng ưu tiên của các luồng tính toán và/hoặc chạy tính toán trên chuỗi gọi.
Làm thế nào điều này có thể được phối hợp giữa tất cả các chủ đề liên quan?
thông tin bổ sung
Các tính toán trong ứng dụng của tôi là hình ảnh hoạt động lọc, điều đó có nghĩa họ là tất cả CPU-bound. Các hoạt động này bao gồm biến đổi affine (từ 50µs đến 1ms) và convolutions (lên đến 10ms.) Tất nhiên hiệu quả của các ưu tiên luồng khác nhau phụ thuộc vào khả năng của hệ điều hành để tránh các tác vụ lớn hơn.
Bạn muốn tính toán trước và lưu bộ nhớ cache một khóa vào bộ nhớ cache precomputation? Bạn có thể, um ... lưu trữ nó trong bộ nhớ cache precomputation? –
@BlueRaja, đáp ứng các yêu cầu # 1 nhưng không phải # 2, # 3 hoặC# 4. – finnw