Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 18, 2012 21:07:28

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

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

mrgloom
наверно я не правильно сделал что commit после каждой записи?
Да, очень медленно работать будет.
mrgloom
или еще лучше наверно работать в памяти а потом, чтобы сбросило на диск.
Лучше примерно по 1000 записей вставлять, потом коммит.

mrgloom
так в нее можно полностью одинаковые записи или с одинаковыми главными ключами?
Да, в вашем случае это просто столбец. А вот так:
create table hash_id (hash PRIMARY KEY, id)
или:
create table hash_id (hash unique, id)
был бы уникальным.

Кстати, вы при чтении файла открываете его с помощью PIL (Image.open(full_path).tostring()). Это может быть медленней чем:
with open(full_path, 'rb') as f:
   im_hash= hashlib.md5(f.read()).hexdigest()

Ну и еще, можно было бы использовать:
- для рекурсивного прохода по файлам
os.walk + fnmatch.fnmatch

- os.path.join вместо
curr_path= main_dir+'\\'+dirs

Кстати, чтобы потом искало быстро в базе, не забудьте сделать индекс по хэшу (в случае primary key не нужно).

off
пока писал, ту тему закрыли :)

Отредактировано reclosedev (Авг. 18, 2012 21:12:22)

Офлайн

#2 Авг. 18, 2012 23:16:47

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

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

reclosedev
Кстати, чтобы потом искало быстро в базе, не забудьте сделать индекс по хэшу (в случае primary key не нужно).
Причем индекс лучше создать именно потом, после вставки всех данных.
Так быстрее.



Офлайн

#3 Авг. 18, 2012 23:18:15

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

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

так сколько можно картинок закодировать MD5 без повторений? (или это несколько некорректный вопрос)

reclosedev
Да, в вашем случае это просто столбец. А вот так:

create table hash_id (hash PRIMARY KEY, id)

или:

create table hash_id (hash unique, id)
не понял, у меня
cur.execute("create table hash_id (hash,id)")
cur.execute("insert into hash_id values (?, ?)", (hash,img_path))
и всё равно я проверил, картинки с разными именами и одинаковым содержанием 2 раза в базу не записало. и тут же вопрос, как в базе быстро найти дубликаты?

reclosedev
Кстати, вы при чтении файла открываете его с помощью PIL (Image.open(full_path).tostring()). Это может быть медленней чем:

with open(full_path, ‘rb’) as f:
im_hash= hashlib.md5(f.read()).hexdigest()
я так понимаю, что если делать f.read(), то туда попадёт еще и метаиформация, а тут получается только блок пикселей.


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



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

Отредактировано mrgloom (Авг. 18, 2012 23:26:55)

Офлайн

#4 Авг. 18, 2012 23:25:39

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

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

slav0nic
хотя из коллизий в молодости находил несколько пар одинаковых файлов (по чексуме) на двд
Ух ты, пример приведешь? Найденный, а не сделанный.

Lexander
тяжелый SHA2
А при хешировании у тебя в проц упирается, а не в диск?

Офлайн

#5 Авг. 19, 2012 14:06:47

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

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

mrgloom
я так понимаю, что если делать f.read(), то туда попадёт еще и метаиформация, а тут получается только блок пикселей.
Тогда согласен.

mrgloom
и всё равно я проверил, картинки с разными именами и одинаковым содержанием 2 раза в базу не записало.
А как проверяли?

mrgloom
и тут же вопрос, как в базе быстро найти дубликаты?
Не совсем понял, на какой стадии это будет делаться. Т.е. сначала все заполняется хэшами и путями, а потом пользователь загружает картинку, и нужно определить, не существует ли она? Тогда:

создаем индекс
Lexander
Причем индекс лучше создать именно потом, после вставки всех данных.
cur.execute("CREATE INDEX hash_index ON hash_id (hash)")

потом можно искать есть ли в базе картинка:
cur.execute("SELECT COUNT(*) from hash_id WHERE hash = ?", (computed_hash,))
count = cur.fetchone()[0]  # количество картинок с этим хэшем

или пути (id??) до картинок с данным хэшем:
cur.execute("SELECT id from hash_id WHERE hash = ?", (computed_hash,))
ids = cur.fetcall()

mrgloom
п.с. как sqlite3 относится к тому, что её насилуют в несколько потоков? или тут опять же надо копить записи в потоках, а потом сливать блокируя доступ для остальных?
sqlite сама блокирует доступ на запись. Возможно timeout только нужно будет увеличить. И в нескольких потоках нельзя одно и тоже соединение или курсор использовать.

upd
Про дубликаты, возможно имелось ввиду это http://stackoverflow.com/a/197114/1052325

Отредактировано reclosedev (Авг. 19, 2012 14:14:38)

Офлайн

#6 Авг. 19, 2012 14:43:25

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

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

odnochlen
А при хешировании у тебя в проц упирается, а не в диск?
Это вопрос выбора адекватного эффективного инструмента, а не вопрос достаточной оптимизации.
В том смысле, что и микроскопом можно гвозди забивать, но зачем?



Офлайн

#7 Сен. 5, 2012 21:31:31

elvira_live
Зарегистрирован: 2012-09-05
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

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

odnochlen
mrgloom
наверно лучше перенести в базы данных.
Модерам пофиг же.
подарки
mrgloom
MD5
MD5 использовать не рекомендуется, вместо него лучше брать SHA2 и, если надо, обрезать.
Я с вами полностью согласна odnochlen, модерам всегда пофиг. И это печально

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version