Как быстро сравнить большое число прайс-листов с данными в БД?
Здравствуйте!
Есть ситуация, в которой клиенты могут загружать на сервер прайс-листы (в том числе и очень большие) либо просто давать ссылку на них. Есть база данных, где хранятся обработанные данные из прайс-листов. Соответственно нужно поддерживать актуальность данных, особенно когда речь идет о ссылках на прайс-лист где-то на сервере клиента. Сами файлы - стандартная выдача товаров в формате YML или CSV.
Ясно, что это должна быть крон-задача. Но дальше, когда речь заходит о производительности (файлов много, и нагрузка на процессор в момент исполнения таска должна быть минимальной), возникает несколько путей.
1) скачивание файла, определение его размера, парсинг, сравнение
Самый медленный способ, который сразу отметается.
2) скачивание файла, получение его хэш-суммы, и сравнение полученного значения с тем, что хранится в базе данных
На мой взгляд, способ гораздо лучше предыдущего, т.к. мы тратим ресурсы сервера только на гарантированно измененные файлы. Минус - парсить все равно придется, и хэш-сумма может различаться даже если файл по содержанию одинаковый.
3) получение размера файла и даты его изменения дистанционно (по CURL), и на основании этого решать, обновился файл или нет, если да - скачивать и парсить
Более быстрый способ, чем предыдущий, но могут возникать ложные срабатывания. Хэш-сумма мне видится более надежной.
4) создание специфической структуры, например, на базе sphinx или elastic search, решать, парсить файлы или нет, на основе хэш-суммы или времени изменения
При этом файлы все-таки придется парсить, но сам поиск данных в базе данных на базе этого решения будет быстрее.
Верно ли я выбрал последний вариант как оптимальный, и лучше не сделать? Может, можно сделать решение быстрее, чтобы вообще парсить не пришлось (или свести этот процесс к минимуму) - создать какой-нибудь индексный файл, или использовать алгоритм поиска, который будет выполняться за одно и то же время вне зависимости от размера исходных данных (но я не уверен, применимо ли это к xml \ csv - там речь шла про массивы и деревья)? Возможно, использовать diff для вычленения измененных участков?
Как бы подошли к данной проблеме вы?
Заранее спасибо.