문제

에서 실행되는 응용 프로그램 윈도우 모바일 6 될 필요가 있는 검색할 수 있는 모든 항목에서는 테이블 항목을 포함하는 지정된 문자열(제공되는 최종 사용자에 의해)내에서 항목 설명 필드입니다.문제는 약이 있습니다 170,000 항목을 테이블에 있습니다.문을 반환해야 하는 모든 항목 문자열이 포함된 어디서나 설명에 나가 사용하도록 강요하는 다음과 같%문자열에%,는 어떤 기회를 제거하여 인덱스를 사용.데이터와 테이블의 구조는 원래에 따라 진행하는 데이터베이스는 운영자 포함에서 어떤 단어를 인덱스가 필드가 있습니다.이 경우에 우리 모바일 응용 프로그램을 사용하기 때문에 SQL Server 소형 3.5.

기본적으로,내 DAL 쿼리를 실행합 SqlCeDataReader 다음 사용하 ItemFactory 목록을 작성하는 개체만을 포함하는 일치하는 항목입니다.이것은 분명히을 계속 할 수 있는 우리의 도메인/사업체에서 별도의 데이터 액세스를 계층입니다.

멋을 제외한 8m 및 42s 걸리는 항목을 검색하면 나는 검색을 위한 모든 포함하는 항목을 같"골프"에서 설명합니다.물론 이것은 허용되지 않습 시간에 대해 최종 사용자에게 있습니다.

내 첫 번째 시도하는 대신 모든 항목에서 다시 사용하여 데이터베이스를 선택*에서"항목(을 가진 주문 절에서 하나의 주요 인덱싱된 필드).나는 이 시점에서 실행 IndexOf 체크인으로 실행을 통해 SqlCeDataReader 했 ItemFactory 만 목록에 항목을 추가 개체이 포함된 경우 요청한 설명 텍스트입니다.이 속도를 향상시킬 수 있었을 1m46 초.너무 초라한,하지만 아직도 너무 느려집니다.

나는 다음을 시도했는 다른 방법을 보여주었다.거의...애플리케이션이 시작되는 동안,나는려고 목록을 작성 포함 모든 항목을 개체 내에서 데이터베이스(약 2 분 정도 소요됩 쿼리를 실행하고 채우 전체 목록은,하지만 적어도 그것은 한 번만 응용 프로그램은 초기화...다.우).목록이 완료되면,나는 쉽게 실행할 수 있습니다 쿼리 목록에서 일을 하는 다음과 같은(나는 나의 구문은 바로...나는 직장에서 지금이 없는 Visual Studio pc 에서 나에 앉아):

List<Item> specificItems = 
    AllItems.FindAll(i => i.Description.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0);

이 접근 방식 그것은 노래를 21.매우 좋은(아직도록에서 그랜드 방식의 것).그런데,문제는 메모리 사용량이 너무 좋다면 나는 모든 항목에서 데이터베이스입니다.가 실제로 잘라 마지막 20,000 항목(그래서 21 시간은 아마이었을 것 같은 더 25s)초기 로드기 때문에 OutOfMemoryException 되고 있었다 발생합니다.에 따라 메모리의 관리자에 에뮬레이터,나는 아직도에 대한 20MB RAM,그러나 내가 들었는데 과정만 있을 수 있습 32MB RAM 관련하(확실하지 않는 경우에는 사실에 대한 WM6,하지만 그것이 나타납니다 그래서).

을 확인하지 않았었기 때문에 목록을 사용하는 개체는 모든 항목(나는 인스턴스화하는 데 필요한 용량에서 그것의 생성자를 피하는 동적 크기),내가 또한 읽을 일으킬 수 있는 추가 메모리 사용량을 때 implicity 전화 EnsureCapacity,나를 사용하여 항목[]array(크기에 앞서 시간).이 여전히 메모리 문제와 크기 차이는 무시할 수 있습니다.

확인을 충분히 산책.난 가능성이 있는 몇 가지 방법을 제한된 기록을 통해 데이터베이스에서 datareader(일부를 통해 인덱스 검색에 다른 유형의 분야)및 그 사용하시는 것이 indexOf 에는 작은 항목의 하위 집합 최대의 성능을 얻을 수 있습니다(따라서 건너뛰는 운영자와 같은이 모두 함께).이것은 최종 사용자를 입력하면 더 이상 단지 설명을 검색만(아마도 항목 계층에 정보를 제한하는 어떤 유형의 항목 내에서 검색하).

어떤 아이디어가?내가 이것에 대해 잘못된 방법?

경청해 주셔서 감사합(이 게시물을 긴,난류의 생각).

Oh 난(그냥에서 요약)내가 무엇을 사용:

  • 윈도우 모바일 6
  • Sql Server Compact Edition3.5
  • C#3.5

업데이트:는 동안에 꽃을 필터에 접근 아래에 언급된 재미있는 듯 수 없는 하나의 요구 사항을 충족(요 정말로 지정 위).나는 정말 못에 맞는 단어가 내부에 포함된 다른 말로(예:"클럽"가 반환하지 않아"클럽").이 때문에,내가 사용하도록 강요하는 다른 접근 방식 모두(켄트 프레드릭...가리키는 주셔서 감사합니다 이).되 켄트의 응답으로 올바른 하나 때문에,자신의 접근 방식이었다는 하나 가득 가장 요구 사항(미치,귀하의 비슷한 문제로 꽃을 필터에 의해 제안 Jaunder).그러나 내가 다른 접근 방법(예금)보다 그의 방법뿐만 아니라.

내가 무슨 짓을 한 것은 당겼는 모든 품목 개체 메모리로만 항목 번호 및 설명(계속 그것은 아래의 메모리가 제한,그러나 그것은 여전히 발생하는 더 이상의 초기화상과 같다.멀티 스레딩 및 로드하는 정보는 뒤에서 응용 프로그램이 실행되는 동안 돌볼 수 있다는 추측).을 수행할 수 검색을 썼어요 내가 포함 루틴입니다.일상적인 기록에서 관리되지 않는 c#코드를 사용하는 두 개의 포인터와 부부의 루프를 통해 실행의 설명과 일치하는 데 필요한 텍스트입니다.일치하는 항목을 찾으면 어디서나에 설명을 추가,항목이 수하는 훌륭한 기능들을 가지고 있습니다.모든 항목이 검색되었,새로운 쿼리를 데이터베이스 및 잡고만 일치하는 품목번호(은 매우 빠르 때문에 인덱스에 정수 필드).한 다음 해당 항목에서 만들어진 목록과 함께 모든 정보(아니라 항목 번호 및 설명).전체 작업은 약 5-10 초(에 따라서 설명),이는 충분히 좋다.

난 여전히 추가로 최적화이(를 추적할 수 있습니다 얼마나 많은 문자는 검색어가...이 있는 경우 적은 캐릭터에 남아있는 항목 설명보다는 데 필요한 텍스트,루프 수에 계속 직진하여 다음 항목).

어떤 제안은 여전히 환영합니다.지금으로 표시해두었습니다 켄트의 응답으로"가장 정확하"대한 내 질문입니다.

소품을 게임을 모두 얻을 돕는 나를 작성을 포함 루틴입니다.

도움이 되었습니까?

해결책

저는 투표에 대한 Mitch 밀의 대답하지만,거기에 몇 가지 기술이 나는 것도 테스트에 대한 효과적입니다.

내 큰 걱정하는 것에 대한 테이블의 전체[char],[int]당신은 여전히 찾을 수 있습니다 자신을 실행한 큰 볼륨의 무의미한 문자열 비교,특히 사용하는 경우%word%에 이 새로운 테이블.(중복되지만-일치하는 우리의 검색 항목).

나는 것 아마 선택 experimeting 과

Words
-----
chars  | word_id 

WordsToEntry
------------
word_id | entry_id 

참조 데이터베이스의 경우 오버헤드가 가치가 완화 방법이 가능한 문제는(나 테스트,죄송합니다)

다른 팁

는 방법에 대해 사전 처리(번)항목이블(그리고 각각의 새로운 항목을 추가하는 것이 필요한 처리),을 만들어 발생 횟 테이블을 갖는

CREATE TABLE WordItemOccurance
(
    [Word] varchar(50) not null,

    ItemId int not null
        constraint FK_Items references ItemTable(ID)
)

반복을 통해 귀하의 모든 항목로 별도의 단어에 항목을 추가 발생으로 테이블은 그들이 발견했다.

을 만드는 인덱스에서[단어]와 합류하는 항목에서 테이블 ItemId 빨리 되어야 합니다.

당신이 시도할 수 있었을 사용하여 피는 필터입니다.

  1. wikipedia
  2. 를 사용하여 피 필터
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top