Форум сайта python.su
вообщем задача такая.
есть папка в ней много папок(предположительно пара мильёнов), а в папках есть файлы от 0 до 300 примерно.
проходимся по всем папкам и считаем MD5 файлов, получаем список структур (название папки,список MD5 стрингов).
потом допустим на вход программы подаётся файл у него считается MD5 и надо найти к какой папке относится файл.
как это лучше всего реализовать?
сделать просто базу данных типа ключ название папки - содержимое список стрингов MD5?
п.с. MD5 не принципиально, просто для примера.
Офлайн
Ну можно примерно так, только ключ - это то, по чему будет поиск, поэтому в данном случае - это MD5.
т.е.
md5 /full/path/to/file
md5 /full/path/to/another/file
Офлайн
а в таком случаем в базе можно хранить элементы не с уникальным ключом, т.е. чтобы у разных записей в базе были одинаковые md5?
и как записывать md5 как строку?
Офлайн
mrgloomВам не кажется странным то, что вы пишете в две одинаковых темы одновременно? Во второй вам уже был дан ответ на этот вопрос. Ключи неуникальными быть не могут. В качестве значений просто должен быть список. Хотя я не знаю, какую БД вы выбрали. В реляционной никто не мешает в одной таблице находиться в одинаковым значениям.
а в таком случаем в базе можно хранить элементы не с уникальным ключом, т.е. чтобы у разных записей в базе были одинаковые md5?
mrgloom
и как записывать md5 как строку?
>>> type(hashlib.md5('12345').hexdigest()) <type 'str'>
Отредактировано fata1ex (Авг. 18, 2012 15:17:36)
Офлайн
ну 1 тему удалите или склейте, я просто 1 создал не там, а потом её перенесли к другой в раздел.
я использую встроенную sqlite3, так в нее можно полностью одинаковые записи или с одинаковыми главными ключами?
import os import hashlib import glob from PIL import Image import sqlite3 class id_hash: def __init__(self, id): self.id = id self.hash_list=[] def get_id(str): s=str.split('id_') return s[1] con = sqlite3.connect('G:/project/test.db') cur = con.cursor() #cur.execute("create table hash_id (hash,id)")# not every time? #con.commit() def put_in_db(hash,img_path): cur.execute("insert into hash_id values (?, ?)", (hash,img_path)) con.commit()#not from every submit? os.chdir("F:/my_db") #put path to param main_dir= os.getcwd() dir_list=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)] #too complicated but work if __name__ == '__main__': for dirs in dir_list: curr_path= main_dir+'\\'+dirs os.chdir(curr_path) for it in glob.glob("*.jpg"): full_path= curr_path+'\\'+it try: im= Image.open(full_path) im_hash= hashlib.md5(im.tostring()).hexdigest() put_in_db(im_hash,full_path) except: print 'eror'
Отредактировано mrgloom (Авг. 18, 2012 19:50:49)
Офлайн
mrgloomУгу.
по идее надо копить в памяти до какого то размера список записей а потом уже делать массовую вставку и коммит?
mrgloomЛучше. Если объем памяти позволяет.
еще лучше наверно работать в памяти а потом, чтобы сбросило на диск.
Офлайн
Офлайн