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

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

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

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


п.с. MD5 не принципиально, просто для примера.
reclosedev
Ну можно примерно так, только ключ - это то, по чему будет поиск, поэтому в данном случае - это MD5.
т.е.
md5    /full/path/to/file
md5 /full/path/to/another/file
Для базы тут даже sqlite из стандартной библиотеки подойдет.
mrgloom
а в таком случаем в базе можно хранить элементы не с уникальным ключом, т.е. чтобы у разных записей в базе были одинаковые md5?

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

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

>>> type(hashlib.md5('12345').hexdigest())
<type 'str'>
mrgloom
ну 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 после каждой записи? по идее надо копить в памяти до какого то размера список записей а потом уже делать массовую вставку и коммит?

или еще лучше наверно работать в памяти а потом, чтобы сбросило на диск.
Lexander
mrgloom
по идее надо копить в памяти до какого то размера список записей а потом уже делать массовую вставку и коммит?
Угу.
mrgloom
еще лучше наверно работать в памяти а потом, чтобы сбросило на диск.
Лучше. Если объем памяти позволяет.
slav0nic
http://python.su/forum/topic/15353/
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB