nghệ stack: C#/NET 4/WinFormschiến lược để làm việc với một lượng lớn dữ liệu hình ảnh
Bối cảnh:
Dự án mà tôi đang làm việc là một ứng dụng trực quan cho một loạt các ngăn xếp hình ảnh. Cụ thể, mỗi chồng hình ảnh được căn chỉnh với lưới, hiển thị cùng một hình ảnh cùng một lúc và các chức năng xử lý được áp dụng cho các hình ảnh hiện đang xem. Các hình ảnh ngăn xếp chính họ là 150-300 MB và mỗi hình ảnh là 512KB-1MB. Một tập dữ liệu điển hình sẽ bao gồm ~ 100 ngăn xếp hình ảnh.
Câu hỏi:
Để thử và làm việc với lượng dữ liệu này, tôi đang sử dụng một vài technqiues:
- bộ nhớ ánh xạ tập tin: ngăn xếp hình ảnh được nạp từ đĩa vào khởi động ứng dụng
- biên soạn dưới x64 với mã không an toàn được cho phép: Rõ ràng là tôi cần không gian địa chỉ 64 bit cho các tệp có kích thước này. Tôi đang di chuyển hình ảnh hiện được hiển thị từ tệp ánh xạ bộ nhớ sang phương thức tạo bitmap qua Marshal.Copy với các con trỏ không an toàn.
- System.Threading.Tasks: Tôi đang sử dụng các vòng lặp song song để xử lý nếu có thể
- System.Drawing.BufferedGraphicsContext: Mỗi ngăn xếp hình ảnh có một hình ảnh hoạt động được tổng hợp thành BufferedGraphicsContext trước khi được chuyển đến PictureBox để hiển thị người dùng.
- yêu cầu hệ thống cao cấp: quad-core CPU hoặc tốt hơn, SSD, bộ nhớ 12GB, vv
Tuy nhiên, thậm chí sử dụng tất cả những điều trên, các reponsiveness nhiều lá để được mong muốn. Sử dụng SysInternals Process Explorer, mức sử dụng CPU thấp (< 25%) trong khi mức sử dụng bộ nhớ tăng lên mức giới hạn trước khi việc thu gom rác xảy ra.
Hồ sơ cho thấy rằng hầu hết thời gian thực hiện được dành để lấy dữ liệu ra khỏi tệp ánh xạ bộ nhớ. Tôi giả sử nó chờ đợi khi các trang hệ điều hành bộ nhớ yêu cầu trở lại vào bộ nhớ hoạt động?
Tôi có thể làm gì khác để cải thiện hiệu suất?
Lưu ý:
- Hầu hết, nếu không phải tất cả, ngăn xếp hình ảnh sẽ có thể xem cùng lúc nên cắt cho khung nhìn hiện tại có thể không mang lại nhiều tốc độ.
- Thay đổi kích thước để hiển thị là một tùy chọn, nhưng dữ liệu gốc hoàn chỉnh phải luôn sẵn sàng để xử lý vì vậy có vẻ như đó chỉ là một bước bổ sung.
Cập nhật 1:
- Đối với bộ nhớ, hộp phát triển của tôi chỉ có 6 GB (và tôi đang cố gắng để tải các tập tin ít như vậy), nhưng hệ thống triển khai sẽ có 24 GB .
- Tôi đang xem xét việc sử dụng tối ưu hóa SSE thông qua Intel Performance Primitives và GPU accelleration thông qua CUDA.
- Lý do tôi đang cố gắng tải tất cả dữ liệu vào bộ nhớ là vì một bước quan sát trực quan quan trọng là đi qua các ngăn xếp hình ảnh ở 15-60 Hz và tôi sợ bị đập.
chỉ muốn kiểm tra - không có cách nào mà rất nhiều điều này chỉ có thể được trao cho một card đồ họa để lo lắng về? –
"rất nhiều bộ nhớ" là gì cho bạn? –