Tôi có một bộ sưu tập lớn các chuỗi (tối đa 1M) được sắp xếp theo thứ tự bảng chữ cái. Tôi đã thử nghiệm với các truy vấn LINQ đối với bộ sưu tập này bằng cách sử dụng HashSet, SortedDictionary và Dictionary. Tôi đang lưu trữ bộ nhớ cache tĩnh, kích thước lên tới 50MB và tôi luôn gọi truy vấn LINQ đối với bộ sưu tập được lưu trong bộ nhớ cache. Vấn đề của tôi là như sau:Hiệu suất LINQ cho Bộ sưu tập Lớn
Bất kể loại bộ sưu tập nào, hiệu suất kém hơn nhiều so với SQL (tối đa 200ms). Khi thực hiện một truy vấn tương tự với các bảng SQL nằm bên dưới, hiệu suất sẽ nhanh hơn nhiều (5-10ms). Tôi đã triển khai các truy vấn LINQ của mình như sau:
public static string ReturnSomething(string query, int limit)
{
StringBuilder sb = new StringBuilder();
foreach (var stringitem in MyCollection.Where(
x => x.StartsWith(query) && x.Length > q.Length).Take(limit))
{
sb.Append(stringitem);
}
return sb.ToString();
}
Tôi hiểu rằng HashSet, Dictionary, etc. thực hiện tra cứu bằng cách sử dụng tìm kiếm cây nhị phân thay vì liệt kê tiêu chuẩn. Các tùy chọn của tôi cho các truy vấn LINQ hiệu năng cao vào các loại bộ sưu tập nâng cao là gì?
Tuyệt vời! Hiệu suất cao và chính xác những gì tôi đang tìm kiếm. Bạn có đề xuất phương pháp này (sửa đổi tất nhiên) để truy vấn vào các thuộc tính trên một tập hợp các đối tượng không phải chuỗi không? –
Có, bạn có thể làm cho lớp chỉ số chung và sử dụng một HashSet thay vì một danh sách, sau đó bạn có thể tạo các chỉ mục cho các thuộc tính khác nhau và cắt ngang HashSets để thu hẹp các mục để tìm kiếm. – Guffa
Điều gì về chuỗi ngắn hơn indexLength - Add() sẽ không lưu trữ chúng và Find() sẽ không tìm thấy chúng? – Sam