Форум сайта python.su
Ребят, я создал некий список с md5 хэшами весом 9ГБ на каждой строке по 1 хэшу. Написал программу для поиска нужного мне хэша, но вот в чем проблема программа загружает файл по одной строке и сравнивает с тем что я дал и из-за этого как я думаю процесс проверки всего файла занимает 2 м 50с . Для меня это слишком медленно хотелось бы 30 сек-1минуты. Я подумал что если загружать файла частями и считывать среди них то будет быстрее. Вот код
from __future__ import print_function import io import time print('Give Me Your HashRound Please') word = input() with io.open('baseWD.txt', encoding='utf-8') as file: for line in file: if word in line: print(line, end='') time.sleep(5)
Отредактировано FLX (Апрель 1, 2017 14:35:17)
Офлайн
FLX
использовать базу данных с индексом по хешу
Офлайн
JOHN_16Ты имеешь ввиду в sql перегнать? Если да то подскажи как
FLXиспользовать базу данных с индексом по хешу
Офлайн
ну раз 9Гб, то брать к примеру PostrgeSql и туда гнать. Как? ну материалов немерено. Написали этот код - напишите другой. Это настолько тривиально, что не составит труда
Офлайн
FLX
Да там реально не составит труда. Одномерная таблица, ведь. В новый postgresql привалило фишек по параллельной обработке, так что можно надеяться на “нехилый” прирост.
Офлайн
4kpt_VА в коде надо будет менять что-либо кроме разрешения файла?
FLXДа там реально не составит труда. Одномерная таблица, ведь. В новый postgresql привалило фишек по параллельной обработке, так что можно надеяться на “нехилый” прирост.
Отредактировано FLX (Апрель 2, 2017 01:02:40)
Офлайн
FLXВы прикалываетесь? Ни одной строчки не совпадет. Будет три страницы полностью нового текста :)
А в коде надо будет менять что-либо кроме разрешения файла?
Отредактировано doza_and (Апрель 2, 2017 03:04:49)
Офлайн
doza_andЯ сгенерировал базу хэшей, каждый хэш в порядке возростания числа числа на новой строке например
Отредактировано FLX (Апрель 2, 2017 09:55:59)
Офлайн
Да чет я ночью плохо делю.
Посмотрел сейчас. У меня на чтение получается порядка 82 Мб/c те на вашем файле около 110 секунд.
Это минимум что нужно для чтения всех ваших данных.
FLXПотому что алгоритм не такой дубовый как у вас.
людей с весами файлов еще больше,но у них находился хэш 2-3 секунды.
Отредактировано doza_and (Апрель 2, 2017 13:19:00)
Офлайн
На Вашем месте я бы подумал об оптимизации вашей системы хранения данных. На мой взгляд тут главная проблема не скорость считывания файла с диска, а скорость поиска. Ее можно существенно ускорить, но необходимо переделать структуру данных.
Например, я бы поступил таким образом. Во-первых, в качестве хранилища данных выбрал бы не один файл, а каталог, например “basewd”
Во-вторых, если бы мне надо было бы сохранить хэш “c4ca4238a0b923820dcc509a6f75849b” из Вашего примера, то я бы
1. В каталоге хранилища создал папку “c4” (первый байт хэша), если она еще не существует.
2. Внутри этой папки создал текстовый файл “ca.txt” (второй байт хэша), если он не существует
3. В этот файл записал бы хэш “c4ca4238a0b923820dcc509a6f75849b” в том же виде как и было раньше.
В этом случае поиск по хранилищу конечно-же усложнится и станет двухэтапным. На первом этапе Вам нужно будет проверить существование файла “basewd/c4/ca.txt”. И, если он существует, то на втором этапе, внутри этого файла осуществить поиск так же как и раньше.
Но, и это главное, прямой поиск Вы будете осуществлять не на всем первоначальном массиве 300000000 записей, а только на выборке примерно в 300000000 /(255*255) ~= 4614 записей. Здесь в знаменателе количество возможных комбинаций подкаталогов и файлов (первый и второй байт хэша).
Ну это так, если не отказываться от текстового хранилища данных, а делать все по быстрому и не со зла.
Офлайн