3

나는 서비스 패브릭 stateful 서비스에 신뢰할 수있는 사전 있습니다. 나는 간단한 linq 표현을 가지고있다.
asyncenumerable을 빌드하기 위해 1x-Async 패키지를 사용하고 있습니다. 하늘색 서비스 패브릭 신뢰할 수있는 사전 linq 쿼리 매우 느림


using (ITransaction tx = this.StateManager.CreateTransaction()) 
     { 

      var result = (await customers.CreateLinqAsyncEnumerable(tx)) 
       .Where(x => x.Value.NameFirst != null && x.Value.NameFirst.EndsWith(n, StringComparison.InvariantCultureIgnoreCase)) 
        .Select(y => y.Value); 

      return await result.ToList(); 


     } 

이 데이터는 각 파티션에서 약 75,000 레코드와 파티션 (2)으로 구성된다. Int64 범위를 파티션 키로 사용하고 있습니다. 위의 코드에서 "Result.ToList()"는 각 파티션에 대해 약 1 분 정도 걸립니다. 또 하나의 결과는 비어 있습니다. SQL Server에서 실행되는 동일한 sql은 고객 이름이 "c"로 끝나는 행을 반환합니다. 그러나 이것은 요점 외에도 있습니다. 내 가장 큰 관심사는 "ReliableDictionary"linq 쿼리의 성능입니다.
감사합니다.

+0

기록은 얼마나 큽니까? 어떤 하드웨어를 사용하고 있습니까? 당신은 로컬 dev 머신이나 실제 클러스터에서 측정을 했습니까? 같은 기계에있는 다른 서비스? 차이가 있는지 1x-Async 패키지를 사용하지 않고 열거하려고 시도 했습니까? –

+0

표는 1 개의 이진 열 [그림]이 있다는 것을 제외하면 표준 표입니다.이것은 로컬 개발 클러스터입니다. 16GB의 RAM을 확보하십시오. 사전에 인서트가 빠르게 타 오릅니다. [분당 2000 건 정도]. Dictionary by Key (키 찾기)도 매우 빠릅니다. 나는 asyncenumerator를 사용하여 전체 75,000 레코드를 열거했고 술어를 적용했다. 여전히 약 50 초가 걸렸습니다. – teeboy

+0

도움이 필요하시면 사진을 저장하는 것을 권장하지 않습니다. 일반적으로 이미지 파일의 URL을 blob 저장소 또는 다른 것으로 저장합니다. 대략 사진이 얼마나 큽니까? 항상 기억 속에 남아있는 것은 아닙니다. 기본적으로 당신이하고있는 일은 그 열거 중에 디스크에서 사진을 RAM으로 가져 오는 것입니다. 열거 시간에는 사진 데이터의 다른 처리도 포함됩니까? –

답변

5

신뢰할 수있는 사전은 메모리에서 가장 최근에 사용되지 않은 값을 주기적으로 제거합니다. 복제 당 신뢰할 수있는 컬렉션과 노드 당 복제본의 높은 밀도의 높은 밀도 :이

  • 높은 밀도

    • 대형 신뢰할 수있는 사전을 활성화하는 것입니다.

    메모리가 캐시되지 않은 값을 검색하려면 디스크 IO가 필요하므로 읽기 대기 시간이 늘어날 수 있습니다.

    열거 형에서 대기 시간을 줄이는 데는 몇 가지 옵션이 있습니다.

    1) 필터링 된 열거 형 : 쿼리에 사용할 필드를 ReliableDictionary의 TKey (위 예제의 NameFirst)로 이동할 수 있습니다. 이렇게하면 키 필터를 사용하는 과부하 CreateEnumerbleAsync을 사용할 수 있습니다. 키 필터를 사용하면 신뢰할 수있는 사전에서 쿼리와 일치하지 않는 키의 값을 디스크에서 검색하지 않도록 할 수 있습니다. 이 접근법의 한 가지 한계는 TKey (따라서 내부의 필드)를 업데이트 할 수 없다는 것입니다.

    2) 알림을 사용하는 메모리 내 보조 색인 : Reliable Dictionary Notifications을 사용하여 원하는 수의 보조 색인을 만들 수 있습니다. 모든 값을 메모리에 유지하는 보조 인덱스를 작성하여 메모리 리소스를 교환하여 읽기 대기 시간을 줄일 수 있습니다. 또한 보조 색인을 완전히 제어 할 수 있으므로 보조 색인을 순서대로 유지할 수 있습니다 (예 : 귀하의 예에서 NameFirst의 반대).

    신뢰할 수있는 사전의 메모리 내 TValue 스윕 정책을 구성 가능하게 만드는 것도 고려하고 있습니다. 이렇게하면 읽기 대기 시간이 우선 순위 인 경우 모든 값을 메모리에 유지하도록 신뢰할 수있는 사전을 구성 할 수 있습니다.

    열거 형의 대부분의 시간이 디스크 IO에 소요되므로 Custom Serializer을 사용하면 디스크 및 네트워크 공간을 줄일 수 있습니다.

    질문 해 주셔서 감사합니다.