2014-11-05 4 views
0

나는 (Gtk.TreeModel에서 상속 한) 커스텀 모델을 가진 Gtk.TreeView를 가지고 있으며 ~ 150K 행을 보여줍니다. 나는 PyGtk를 사용하고 있지만 그다지 중요하지 않아야한다.최적화 pygtk/gtk 정렬 된 열의 TreeView 대화 형 검색?

GUI 상호 작용은 정상이지만 대화 형 검색을 활성화하면 영원히 걸립니다 (1 초당 ~ 10 초). Searching a ListStore에서 이해하고 테스트 한 내용에 따라 interactive-search는 ListStore (내부적으로 연결된 목록으로 저장 됨)의 각 행을 검사하여 값을 찾습니다.

정렬 된 열을 검색하고 있으므로 이진 검색을 수행하려고합니다.

어떻게하면됩니까? 대화 형 검색을 처음부터 다시 프로그래밍해야합니까? TreeModelSort은 유용 할 수 있습니까? (내부 구조가 어떻게 관리되는지 모르겠다.)

내 자신의 검색 UI를 롤업하면 어떻게 시작해야할지 모르겠다. 스케치은 다음과 같습니다

  1. Disable built-in interactive search
  2. 가 검색 UI를 만들고
  3. 수동으로 데이터를 내 사용자 정의 표현에서 이진 검색을 할 권리의 키에 연결 (또는 정렬에 표시된 임의 액세스가 가능한 경우 행)
  4. 정확한 일치 항목을 선택하십시오.

3.의 경우는 행에 대한 랜덤 액세스가 GtkTreeModel에서 보인다

gtk.TreeModel 객체는 당신이 나타내는 gtk.TreeModelRow 객체를 검색 할 수 있습니다 파이썬 매핑 프로토콜의 일부를 지원

모델의 행.

정말 효율적으로 랜덤 액세스합니까?

답변

0

정확하게 사용자 정의 gtk.TreeModel을 구현하는 방법이 확실하지 않습니다 - ListStore입니까, 아니면 직접 롤아웃합니까? 150K 행이 있더라도 목록 저장소를 검색하는 데 10 초가 걸릴지는 확실하지 않습니다.

ListStore에서 이진 검색을 구현할 수 있지만 TreeView으로 구현 된 검색은 이진이 아니며 단순히 현재 위치에서 끝까지 목록을 검색하여 일치하는 항목을 찾습니다. 검색 전략이 아닌 "equals" callback을 사용자 정의 할 수 있습니다. 필요한 것은 키를 받아들이고 트리에서 해당 위치를 반환하는보다 일반적인 검색 함수입니다.

큰 나무를 효율적으로 검색하려면 사용자가 질문에 대한 편집에서 요약 한 내용을 따라 검색 UI를 롤업해야합니다. 기존 구현을 살펴보면 많은 작업이 필요하지 않습니다. 즉, activate 신호가 검색을 수행하는 코드에 연결된 항목을 포함하는 최상위 수준의 gtk.WINDOW_POPUP 창을 표시하는 것으로 나타납니다. 발견 한 행에 트리 커서를 배치합니다.

+0

질문을 명확하게 편집했습니다. TreeModel은 임의 액세스를 구현하지만 나에게는 기본 TreeStore가 없다고 당황 스럽습니다. 진실은 무엇입니까? –

+0

@BastienJacquet'TreeModel'은 인터페이스이고,'TreeStore'와'ListStore'는 당신이 후자를 사용하고있는 구체적인 구현물입니다.'ListStore'는 링크리스트가 아니며, 내부적으로 시퀀스 API를 노출하는 트리 인'GSequence'를 사용하여 구현됩니다. 'GSequence' (그리고 결과적으로'ListStore'는 확장 성을 갖도록 설계되었으므로 목록의 어느 곳에서나 O (log n) 삽입과'O (log n)'임의 접근을 가능하게합니다. 예상 복잡도가'O (log^2 n)'인'ListStore'를 사용하여 이진 검색을 구현합니다. – user4815162342