Форум сайта python.su
mrgloomДа, очень медленно работать будет.
наверно я не правильно сделал что commit после каждой записи?
mrgloomЛучше примерно по 1000 записей вставлять, потом коммит.
или еще лучше наверно работать в памяти а потом, чтобы сбросило на диск.
mrgloomДа, в вашем случае это просто столбец. А вот так:
так в нее можно полностью одинаковые записи или с одинаковыми главными ключами?
create table hash_id (hash PRIMARY KEY, id)
create table hash_id (hash unique, id)
with open(full_path, 'rb') as f: im_hash= hashlib.md5(f.read()).hexdigest()
curr_path= main_dir+'\\'+dirs
Отредактировано reclosedev (Авг. 18, 2012 21:12:22)
Офлайн
reclosedevПричем индекс лучше создать именно потом, после вставки всех данных.
Кстати, чтобы потом искало быстро в базе, не забудьте сделать индекс по хэшу (в случае primary key не нужно).
Офлайн
так сколько можно картинок закодировать 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))
reclosedevя так понимаю, что если делать f.read(), то туда попадёт еще и метаиформация, а тут получается только блок пикселей.
Кстати, вы при чтении файла открываете его с помощью PIL (Image.open(full_path).tostring()). Это может быть медленней чем:
with open(full_path, ‘rb’) as f:
im_hash= hashlib.md5(f.read()).hexdigest()
Отредактировано mrgloom (Авг. 18, 2012 23:26:55)
Офлайн
slav0nicУх ты, пример приведешь? Найденный, а не сделанный.
хотя из коллизий в молодости находил несколько пар одинаковых файлов (по чексуме) на двд
LexanderА при хешировании у тебя в проц упирается, а не в диск?
тяжелый SHA2
Офлайн
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] # количество картинок с этим хэшем
cur.execute("SELECT id from hash_id WHERE hash = ?", (computed_hash,)) ids = cur.fetcall()
mrgloomsqlite сама блокирует доступ на запись. Возможно timeout только нужно будет увеличить. И в нескольких потоках нельзя одно и тоже соединение или курсор использовать.
п.с. как sqlite3 относится к тому, что её насилуют в несколько потоков? или тут опять же надо копить записи в потоках, а потом сливать блокируя доступ для остальных?
Отредактировано reclosedev (Авг. 19, 2012 14:14:38)
Офлайн
odnochlenЭто вопрос выбора адекватного эффективного инструмента, а не вопрос достаточной оптимизации.
А при хешировании у тебя в проц упирается, а не в диск?
Офлайн
odnochlenЯ с вами полностью согласна odnochlen, модерам всегда пофиг. И это печальноmrgloomМодерам пофиг же.
наверно лучше перенести в базы данных.
подаркиmrgloomMD5 использовать не рекомендуется, вместо него лучше брать SHA2 и, если надо, обрезать.
MD5
Офлайн