Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2012 10:51:36

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск в базе (не загружая всё в память)

вообщем задача такая.
есть папка в ней много папок(предположительно пара мильёнов), а в папках есть файлы от 0 до 300 примерно.
проходимся по всем папкам и считаем MD5 файлов, получаем список структур (название папки,список MD5 стрингов).

потом допустим на вход программы подаётся файл у него считается MD5 и надо найти к какой папке относится файл.

как это лучше всего реализовать?

сделать просто базу данных типа ключ название папки - содержимое список стрингов MD5?


п.с. MD5 не принципиально, просто для примера.



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

#2 Авг. 17, 2012 11:27:30

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

поиск в базе (не загружая всё в память)

Ну можно примерно так, только ключ - это то, по чему будет поиск, поэтому в данном случае - это MD5.
т.е.

md5    /full/path/to/file
md5 /full/path/to/another/file
Для базы тут даже sqlite из стандартной библиотеки подойдет.

Офлайн

#3 Авг. 18, 2012 14:47:51

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск в базе (не загружая всё в память)

а в таком случаем в базе можно хранить элементы не с уникальным ключом, т.е. чтобы у разных записей в базе были одинаковые md5?

и как записывать md5 как строку?



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

#4 Авг. 18, 2012 15:14:57

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

поиск в базе (не загружая всё в память)

mrgloom
а в таком случаем в базе можно хранить элементы не с уникальным ключом, т.е. чтобы у разных записей в базе были одинаковые md5?
Вам не кажется странным то, что вы пишете в две одинаковых темы одновременно? Во второй вам уже был дан ответ на этот вопрос. Ключи неуникальными быть не могут. В качестве значений просто должен быть список. Хотя я не знаю, какую БД вы выбрали. В реляционной никто не мешает в одной таблице находиться в одинаковым значениям.

mrgloom
и как записывать md5 как строку?

>>> type(hashlib.md5('12345').hexdigest())
<type 'str'>



Отредактировано fata1ex (Авг. 18, 2012 15:17:36)

Офлайн

#5 Авг. 18, 2012 19:30:03

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск в базе (не загружая всё в память)

ну 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'

наверно я не правильно сделал что commit после каждой записи? по идее надо копить в памяти до какого то размера список записей а потом уже делать массовую вставку и коммит?

или еще лучше наверно работать в памяти а потом, чтобы сбросило на диск.



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Отредактировано mrgloom (Авг. 18, 2012 19:50:49)

Офлайн

#6 Авг. 18, 2012 20:55:23

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

поиск в базе (не загружая всё в память)

mrgloom
по идее надо копить в памяти до какого то размера список записей а потом уже делать массовую вставку и коммит?
Угу.
mrgloom
еще лучше наверно работать в памяти а потом, чтобы сбросило на диск.
Лучше. Если объем памяти позволяет.



Офлайн

#7 Авг. 18, 2012 20:55:36

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

поиск в базе (не загружая всё в память)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version