Я храню/кэширую файловую систему (только имена файлов), чтобы иметь возможность делать быстрые исследования à la Everything. Таким образом, я не хочу использовать встроенный графический интерфейс поиска файлов в ОС.Структура данных для файловой системы
Я делаю это с:
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
будет содержать миллионы элементов:
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))
Действительно, это очень наивный поиск, потому что он требует просмотра он весь список, чтобы найти предметы.
Как сделать запросы быстрее?
Возможно, кажется, что список не является правильной структурой данных для проведения полнотекстового исследования, существует ли подобная древовидная структура?
В Python я думаю, что словарь является тем, что вы ищете! – Acepcs
@Acepcs: даже если я использую dict '{'D: \\': ['a.jpg', 'b.jpg'], ..., 'D: \\ Temp12': ['test.txt ',' test2.txt ']} ', мне нужно будет перебирать все тысячи ключей/значений для поиска ... Можете ли вы точно узнать, что вы имели в виду? – Basj
Ну, точно, полный алгоритм приходит мне в голову. Когда вы идете по каталогам в вашем os, попробуйте сделать словарь имен файлов, каждый из которых является символом в алфавите, а каждое значение представляет собой список имен файлов, которые начинаются с этого символа, например '{'a': ['a3.jpg', 'ab.jpg'], 'b': ['banana.gif', 'bad.jpg']} ', поэтому вы можете сэкономить много времени на итерации путем создания префиксных ключей. Если размер данных действительно очень большой, вы можете построить вложенный словарь префиксов, что-то вроде дерева, реализованного в Python (до некоторой степени) – Acepcs