0

빠른 연구를 수행 할 수 있도록 파일 시스템 (파일 이름 만)을 저장/캐싱합니다. à la Everything입니다. 따라서 OS의 내장 파일 검색 GUI를 사용하고 싶지 않습니다.파일 시스템 용 데이터 구조

내가 함께 할 :

import os 
L = [] 
for root,dirs,files in os.walk(PATH): 
    L.append([root, files]) 

과 결과는 다음과 같다 :

[['D:\\', ['a.jpg', 'b.jpg']], 
... 
['D:\\Temp12', ['test.txt', 'test2.txt']]] 

문제는 L 요소 수백만 포함 할 때 연구를 수행하는 것은 너무 많은 시간을 소요한다는 것입니다 :

를 이 t를 찾아 볼 필요하기 때문에
query = 'test2' #searching for filename containg this text 
for dir in L: 
    for f in dir[1]: 
     if query in f: 
      print '%s found: %s' % (query, os.path.join(dir[0],f)) 

사실, 이것은 매우 순진 검색입니다 그 사람 전체 목록 항목을 찾을 수 있습니다.

쿼리를보다 빠르게 만드는 방법은 무엇입니까?

아마도 전체 텍스트 연구를 수행하는 데 올바른 데이터 구조가 아닌 것 같습니다. 트리 구조입니까? 리스트에

+0

파이썬에서 나는 '사전'이 당신이 찾고있는 것이라고 생각한다! – Acepcs

+0

@Acepcs : Dict '{' 'D : \\': [ 'a.jpg', 'b.jpg'], ..., 'D : \\ Temp12': [ 'test.txt ','test2.txt ']}', 검색을 수행하기 위해 수천 개의 키/값을 반복해야 할 것입니다 ... 당신이 염두에 두었던 것을 정확하게 할 수 있습니까? – Basj

+0

정확히 완전한 알고리즘이 내 마음 속에 들어 있습니다. os에서 디렉토리를 탐색 할 때, 파일 이름의 사전을 만들고, 각 키는 알파벳의 문자이며, 각 값은'{ 'a'와 같이 그 문자로 시작하는 파일 이름 목록입니다. [ 'a3.jpg', 'ab.jpg'], 'b': [ 'banana.gif', 'bad.jpg']}'이므로 접두사 키를 작성하여 반복에 많은 시간을 절약 할 수 있습니다. 데이터 크기가 정말로 큰 경우 중첩 된 접두어 사전을 만들 수 있습니다. Python으로 구현 된 트리 (특정 정도)를 구현할 수 있습니다. – Acepcs

답변

0

의하면 O (n)은, 사전에 연구 상각 O (1). 값을 연결할 필요가 없으면 세트를 사용하십시오. 이에 대한 자세한하려는 경우

: 귀하의 경우 https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

을, 나는 세트를 사용합니다. 그것은 당신의 질문을 훨씬 빨리 만들 것입니다.

편집 :

방법은 빨리 그 방법이 될 수없는 경기에 대한 모든 파일을 확인을하고 있습니다. dict을 사용하더라도 모든 파일 이름이 일치하는지 확인합니다.

새로운 아이디어 : 당신은 각각의 값으로 키와 루트로 모든 파일 이름을 가진 딕셔너리를 생성 할 수 있습니다. 이렇게하면 전체 경로를 나중에 다시 만들 수 있습니다.

아이디어는 트리의 각 노드는 문자했고, 각 것이다 만든 단어 (이름) 사이의 경로 하였다 만들 지금이다. 구현하기가 어려울 수 있으며 트리를 구성하는 방법에 따라 결과가 더 빠를 수 없습니다.

당신은 당신이 각각의 모든 파일 이름 및 그 변경되지 않습니다 목록 또는 딕셔너리를 사용하여 검사 할 것을 기억해야합니다. 트리/그래프는 제가 생각할 수있는 유일한 해결책입니다.

+0

다른 주석에 명시된 바와 같이, {{ 'D : \\': [ 'a.jpg', 'b.jpg'], ..., 'D : \\ Temp12': [ ' test.txt ','test2.txt ']}'검색을 수행하기 위해 수천 개의 키/값을 반복해야 할 것입니다 ... 당신이'dict' 또는 '설정'? 검색을 수행하려면 전체 구조를 반복해야한다고 생각합니다. – Basj

0

데이터베이스를 사용 하시겠습니까?

SQLite는 다음과 같은 기능을 제공합니다 : memory : 데이터베이스에서 메모리만을 생성하는 옵션. 물론 다른 답변과 주석에서 지적한 바와 같이 알고리즘과 데이터 구조를 최적화 할 수는 있지만 일반적으로 데이터베이스는 이미 인덱싱에있어 매우 뛰어나므로 비슷한 것을 설계 할 필요가 없습니다.

테이블 (들) 중 단지 하나의 필드 full_path와 테이블과 파일 이름이 될 수있다, 당신은 이름하여 색인 경우, 빠른 것입니다. 이것은 모든 파일이 full_path에서 전체 경로를 가지기 때문에 많은 중복 정보를 저장할 것입니다. 더 나은 해결책은 디렉토리 용 테이블과 파일 용 테이블을 갖는 것입니다. 그러면 파일의 디렉토리를 참조하여 일치하는 전체 경로를 얻을 수 있습니다.

그냥 생각해보십시오.

한누