Найти - Пользователи
Полная версия: поиск в базе (не загружая всё в память)
Начало » Базы данных » поиск в базе (не загружая всё в память)
1 2
reclosedev
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
пока писал, ту тему закрыли :)
Lexander
reclosedev
Кстати, чтобы потом искало быстро в базе, не забудьте сделать индекс по хэшу (в случае primary key не нужно).
Причем индекс лучше создать именно потом, после вставки всех данных.
Так быстрее.
mrgloom
так сколько можно картинок закодировать 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 относится к тому, что её насилуют в несколько потоков? или тут опять же надо копить записи в потоках, а потом сливать блокируя доступ для остальных?
odnochlen
slav0nic
хотя из коллизий в молодости находил несколько пар одинаковых файлов (по чексуме) на двд
Ух ты, пример приведешь? Найденный, а не сделанный.

Lexander
тяжелый SHA2
А при хешировании у тебя в проц упирается, а не в диск?
reclosedev
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
Lexander
odnochlen
А при хешировании у тебя в проц упирается, а не в диск?
Это вопрос выбора адекватного эффективного инструмента, а не вопрос достаточной оптимизации.
В том смысле, что и микроскопом можно гвозди забивать, но зачем?
elvira_live
odnochlen
mrgloom
наверно лучше перенести в базы данных.
Модерам пофиг же.
подарки
mrgloom
MD5
MD5 использовать не рекомендуется, вместо него лучше брать SHA2 и, если надо, обрезать.
Я с вами полностью согласна odnochlen, модерам всегда пофиг. И это печально
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