2012-06-07 4 views
1
public class User 
{ 
    public int Id { get; set; } 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

사용자가 100,000 명입니다.여러 필드 인덱싱 된 개체 배열

검색어 : 가져 오기 누구의 이름 "라파엘"이고 그의 나이 사용자 Linq2Objects으로

    • 40 내지 50 :. users.Where (P => 페이지 이름 == "라파엘"& & 페이지. 연령> = 40 & & p.Age < = 50) .ToArray();

    성능 향상을위한 대안이 있습니까? (읽기 전용 스레드 안전)

    (MultiIndexed 사용자 배열)

    나는 그것이 성능의 테스트했습니다. 1000k 사용자의 경우 30-50ms가 소요됩니다. 중요한 것은 아니지만 그렇습니다. 1 초에 50 건의 요청을받을 수 있습니다.

    dharnitski의 솔루션을 사용하십시오. 그것은 0ms가 걸립니다. :)

    하지만 투명하게 만드는 코드 프레임 워크가 있습니다.

    public class FastArray<T> 
    
  • +0

    thread로부터 안전한 것으로, 거기에서 쿼리하는 동안 컬렉션에 다른 프로세스가 쓰여지는 것을 의미합니까? –

    +0

    죄송합니다. ReadOnly ThreadSafe. 나는 질문을 업데이트했다. – ozz

    +0

    _ 그러나 코드 프레임 워크가 투명하게 만듭니다 ._ 예. 그것은 RDBMS입니다 :) –

    답변

    4

    데이터가 준비되지 않은 경우 전체 데이터 세트 검사없이 원하는 결과를 얻을 수 없습니다. 시간이 중요하지 않을 때 미리 데이터를 준비하고 짧은 응답 시간이 필요할 때 정렬 된 데이터로 작업하십시오.

    데이터베이스 세계에는 이와 비슷한 비유가 있습니다.

    100K 개의 레코드가있는 테이블이 있습니다. 누군가가 기본 키가 아닌 데이터를 필터링하는 "where"절을 사용하여 Select 쿼리를 실행하려고합니다. 인덱스가 구현되지 않는 한 항상 실행 계획에서 "테이블 스캔"작업이 느려집니다. ILookup<TKey, TValue>를 사용하여 인덱스를 구현하는 코드의

    샘플 :

    //not sorted array of users - raw data 
    User[] originalUsers; 
    //Prepare data in advance (create one index). 
    //Field with the best distribution should be used as key 
    ILookup<string, User> preparedUsers = originalUsers.ToLookup(u => u.Name, u => u); 
    
    
    //run this code when you need subset 
    //search by key is optimized by .NET class 
    //"where" clause works with small set of data 
    preparedUsers["Rafael"].Where(p=> p.Age>=40 && p.Age<=50).ToArray(); 
    

    이 코드는 데이터베이스 인덱스만큼 강력하지 (예를 들어,이 문자열을 지원하지 않습니다)하지만이 아이디어를 보여줍니다.