2010-01-15 4 views
2

시스템의 쿼리에서 검색 한 커스텀 개체가 많이 있습니다. 이 개체에는 모두 이름, 성, 성별, 우편 번호 및 생일의 5 가지 속성이 있다고 가정 해 보겠습니다. 각기 다른 속성에 대해 고유 한 값과 개수의 목록을 가져 와서 내림차순으로 정렬 할 수 있기를 원합니다. 그것은 파셋 형 네비게이션 시스템의 일종입니다. 그래서 초기 쿼리에서 5000 개의 결과를 얻었 으면 상위 10 개 FirstNames를 가장 인기있는 것부터 가장 인기가 적은 것까지 표시 할 수 있기를 원합니다. 그런 다음 다른 속성과 동일합니다.고유 항목을 찾는 데 좋은 .NET 데이터 구조 란 무엇입니까?

현재 각 항목을 한 번에 하나씩 살펴보고 다양한 속성을 검사하고 다양한 해시 테이블을 정보와 함께 보관합니다. 그것은 작동하지만 천천히 슈퍼입니다. 한 번에 하나씩 각 항목을 검토하는 것이 그리 효율적이지는 않습니다. 이 유형의 정보를 쉽게 얻을 수있는 C# 구조의 다른 유형이 있습니까? 저는 SQL Server가 이러한 유형의 작업을 잘 수행하고 있음을 알고 있습니다. 그러나 실제로 그럴 가능성은 없다고 생각합니다. 다른 시스템의 API에서 사용자 지정 개체 목록을 가져오고 있습니다. 그래서 나는 그 객체들의리스트를 가져 와서 어떻게 든 임시 테이블에 넣어야 할 것입니다. 그리고 그런 생각은 내가 생각하는 목적을 이겨내야합니다. SQL Server 임시 테이블은 연결에 따라 달라지며 내 응용 프로그램은 연결을 다시 사용합니다.

편집 : 내가 피하려고하는 것은 목록을 반복하여 각 개별 항목을 처리해야한다는 것입니다. 한 번에 (데이터베이스와 같은) 전체 목록 쿼리를 정렬하고 정보를 얻을 수있는 데이터 구조가 있는지 궁금합니다. 문제는 우리가 프런트 엔드 웹 서버가 서버에 많은 트래픽을 발생시키고 사람들이 이러한면이있는 페이지를 치고 있기 때문에 망치질에 불과하다는 것이며 더 효율적인 방법을 찾고 있습니다.

아이디어가 있으십니까?

덕분에, 코리

+0

왜 쿼리를 수행하고 _your_ 시스템 _에서 쿼리를 정렬하지 않습니까? – kennytm

+0

외부 시스템입니다. 나는 카운트를하고 거기서 분류 할 방법이 없다. 외부 시스템의 API를 통해서만 데이터에 액세스 할 수 있습니다. 그래서 나는 다음을 할 수 있습니다 - List _results = SystemAPI.GetResults(); 그런 다음 MyObjects 목록이 있으면 각기 다른 속성을 얼마나 많이 보유하고 있는지 파악해야합니다. –

+0

* "한 번에 한 항목 씩 지나치는 것이별로 효율적이지 않다고 생각합니다."* 누군가가 더 나은 방법을 생각해 내면 그들은 실제로 매우 부자가 될 것입니다. –

답변

1

불행히도 귀하의 질문에 대한 답변이 "아니오"라고 확신합니다. 데이터를 가져 오는 방법이 인덱싱되지 않은 목록 <MyObject> 인 경우 무언가 무언가를 하나씩 찾아 가서 Top-N을 분석하거나 색인을 생성해야합니다. 다른 도구 (임시 데이터베이스 또는 타사 데이터 구조)에 전달하더라도 처리를 다른 곳에두면 CPU가 그만큼 크랭크됩니다. 원래의 질문에 윤곽을 그리는 해결책은 가장 합리적인 것 같습니다.

몇 가지 제안 :

  • 이 최고-N은 모든 사용자에 대해 동일한 목록입니다, 또는 그들이 사용 사례의 고유 한 숫자로 나눌 수 있을까? 한 번 가져와 웹 캐시에 저장할 수 있습니다. 어쩌면 백그라운드 프로세스를 설정하여 M 분마다 업데이트하여 다소 최신 상태로 유지할 수 있습니다.
  • UI 인식 문제입니까? 가장 중요한 결과를 먼저 계산하여 표시 한 다음 백그라운드에서 다른 결과를 계산하고 비동기 적으로 페이지에 전달할 수 있습니까?
  • 결과를 얻는 더 확실한 방법은 API 제공 업체에 문의하십시오. :)
  • 더 많은 하드웨어를 던집니까 ?? :)

미안하지만 미안하지만 여기에는 마법의 탄환이 없다고 생각합니다.

+0

감사합니다. Dave. 그것은 제가 생각한 것입니다. 내 코드를 약간 리펙토링하고 속도를 높이거나 최적화하는 방법을 찾아야 할 수도 있습니다. 내가 만들고있는 시스템은 패싯 형 탐색이며 사람들이 패싯 (예 : 성 또는 우편 번호 등)을 선택한 다음 선택한 패싯과 일치하는 새 개체 목록을 볼 수 있습니다. 그리고 현재 Top-N 목록은 현재 선택된 패싯에 대한 결과에만 적용되기 때문에 다릅니다. 희망은 그 말이 맞습니다. –

+0

나는 일종의 캐싱을 사용할 수 있으므로 사용자 A가 5 분 전에 선택한 사용자 B와 똑같은면을 사용자 A가 요청하면 캐쉬에서 결과를 제공하도록합니다. 그러나 원래 시스템의 데이터가 변경된 경우 새로 고치기 위해 캐시를 트리거 할 수 있어야합니다. –

0

속성 당 하나 개의 사전이 잘 작동합니다 유지. 얼마나 느린가요? 사용중인 코드를 보여줄 수 있습니까? 눈 깜짝 할 사이에 5000 개의 항목을 처리해야합니다.

.NET 3.5를 사용하고 있습니까? 그렇다면 LINQ가 많은 도움을 줄 수 있습니다. 특히 ToLookup을 사용하면 차례대로 각 속성이 잘 작동합니다.

+0

아니요, .NET 3.5를 사용하지 않습니다. 내가 피하려고하는 것은 목록을 반복하여 각 개별 항목을 처리해야한다는 것입니다. 한 번에 (데이터베이스와 같은) 전체 목록 쿼리를 정렬하고 정보를 얻을 수있는 데이터 구조가 있는지 궁금합니다. 문제는 우리가 프런트 엔드 웹 서버가 서버에 많은 트래픽을 발생시키고 사람들이 이러한면이있는 페이지를 치고 있기 때문에 망치질에 불과하다는 것이며 더 효율적인 방법을 찾고 있습니다. –

+0

안녕하세요, Jon, http://stackoverflow.com/questions/2072752/why-doesnt-my-threaded-net-app-scale-linearly-when-allocating-large-amounts-of – Will

+0

@ 코리 : 어떻게 기대 하시겠습니까? * 적어도 * 한 번 * 목록을 반복하지 않고 요소를 마술처럼 처리하는 모든 * 데이터 구조? 일단 당신이 필요로하는 모든 것이되어야하지만, 일단 그것을해야만합니다 ... –

1

i4o - 인덱싱 된 LINQ http://www.codeplex.com/i4o은 개체에 인덱스를 넣을 수 있습니다.

기본적으로 clr에 대해 RDBMS 스타일의 색인 생성을 제공합니다.

초기 쿼리에 DBMS를 사용하고 있습니까? 이 경우 대답은 다음과 같습니다. 왜 특정 SQL 쿼리를 설계하지 않는가?

+0

DBMS의 초기 쿼리가 없습니다. 내 쿼리가 제한적이므로 제 3 자 API를 사용합니다. –

관련 문제