include в php большого файла

Алексей Теплов
На сайте с 30.12.2019
Offline
38
717

Вообщем у меня сайт по скачиванию видео с Ютуба, активно сотрудничаю с правообладателями и  РКН, абузы сыпятся сотнями в сутки... Не придумал не чего лучше чем с админки добавляю ссылку на видео, а скрипт обработчик даписывает ID видео в файл php в котором 2 одномерных массива айдишников, один от правообладателей, второй от РКН. Перед выдачей юзеру страницы с видео инклайдится файл php и сравнивается  ID видео с айдишниками из стоп-листа. Как бы всё работает, вот только файл стоп-листа разрастается прям на глазах, в связи с чем возник вопрос:

Интерпретатор php тратит ресурсы на распарсивание большого файла, а затем держит в памяти сервера весь стоп-лист... Есть ли более дешёвый способ по затратам ресурса сервера на поиск айдишника в стоп-листе? Самый очевидный вариант писать айдишники в БД, а потом запустить поиск по БД. Какой вариант лучше? Или посоветуйте свой вариант!

Виктор Горняков
На сайте с 25.09.2006
Offline
162
#1
БД однозначно. В ней и мильены записей держи, нагрузки не будет существенной, нежели в файле держать
XMLSeo - поисковая выдача Яндекс, Wordstat, Google через API - https://xmlseo.ru
Алексей Теплов
На сайте с 30.12.2019
Offline
38
#2

Снипеты от видео и файлы на серверах от этого видео я храню в БД... А вот стоп-лист я не догадался сразу в БД писать, да я как то не ожидал что их будет столько много...

Виктор Горняков, спасибо за совет!

Shelton724
На сайте с 26.05.2011
Offline
234
#3
Виктор Горняков #:
БД однозначно.

А я не любитель подключать лишние БД или вообще БД без острой на то необходимости.

Алексей Теплов :
Есть ли более дешёвый способ по затратам ресурса сервера на поиск айдишника в стоп-листе?

Я бы просто немного поменял логику хранения в файлах в зависимости от примерного предполагаемого количества таких id, сделав, например, хранение всех id, начинающихся (заканчивающихся) на 25, в файле с именем 25s.dat. Ну Вы поняли, количество необходимых элементов для поиска и объём загружаемого файла уменьшаются в 100 раз примерно (можно и в 1000, да хоть в 100 000). Вроде способ тупой, "в лоб", но у меня так много чего работает моментально, без БД, используя минимум памяти.

The WishMaster
На сайте с 29.09.2005
Offline
2543
#4
Алексей Теплов :
Вообщем у меня сайт по скачиванию видео с Ютуба

Зачем?

Пешу текста дешыго! Тематики - туризм, СЕО, творчество, кулинария, шизотерика :)
Виктор Горняков
На сайте с 25.09.2006
Offline
162
#5
Shelton724 #:

А я не любитель подключать лишние БД или вообще БД без острой на то необходимости.

Это дело времени. Когда сайт разрастается до крупных масштабов - порой поздно переделывать, лучше на начальном этапе БД создать. Это чисто моё мнение.

Алексей Теплов
На сайте с 30.12.2019
Offline
38
#6

Shelton724 #:

Я бы просто немного поменял логику хранения в файлах в зависимости от примерного предполагаемого количества таких id, сделав, например, хранение всех id, начинающихся (заканчивающихся) на 25, в файле с именем 25s.dat. Ну Вы поняли, количество необходимых элементов для поиска и объём загружаемого файла уменьшаются в 100 раз примерно (можно и в 1000, да хоть в 100 000). Вроде способ тупой, "в лоб", но у меня так много чего работает моментально, без БД, используя минимум памяти.

Да, это тоже вариант отсортировать айдишники по первому символу и распихать по разным файлам, я как то использовал нечто подобное, но там проще было только цифры в айдишнике. Спасибо!

The WishMaster #:

Зачем?

Ну я например знаю подобный сайт с 10м посещалки в сутки... Значит это кому то надо!
NoMoreContent
На сайте с 14.05.2023
Offline
23
#7

Зависит от того, как именно вы проверяете наличие нужной записи в файле.

Зачастую файл заметно лучше БД. Иногда лучше SQLite, иногда - реляционная СУБД, а иногда и не реляционная.

Один из худших, но распространенных в мире PHP способов - зачитать файл в память, заполнить строками условный массив и искать по этому массиву.

S
На сайте с 20.03.2022
Offline
16
#8
The WishMaster #:

Зачем?

Трафика море

Sly32
На сайте с 29.03.2012
Offline
303
#9
NoMoreContent #:
Зачастую файл заметно лучше БД

Например? Применительно к задаче? При хранении большого обьема данных, при необходимости быстрого доступа, например по индексу, чем?

NoMoreContent #:
Иногда лучше SQLite, иногда - реляционная СУБД

Я наверное не понял, Имеешь ввиду что SQLlite  не реляционная?

NoMoreContent #:
иногда и не реляционная

Когда? Как-то все ответы не подтверждены.

Например, если ТС будет хранить данные в NoSQL DB like MongoDB, он получит самый быстрый доступ по хэшу обьекта, остальные способы не сравнятся. Но проиграют по памяти

NoMoreContent
На сайте с 14.05.2023
Offline
23
#10
Sly32 #:

Например? Применительно к задаче? При хранении большого обьема данных, при необходимости быстрого доступа, например по индексу, чем?

Я наверное не понял, Имеешь ввиду что SQLlite  не реляционная?

Когда? Как-то все ответы не подтверждены.

Например, если ТС будет хранить данные в NoSQL DB like MongoDB, он получит самый быстрый доступ по хэшу обьекта, остальные способы не сравнятся. Но проиграют по памяти

Про преимущества файлов.

В стартпосте речь идёт о YouTube. Мне приходилось писать утилиту для работы с его API. Для работы с ним характерны большие объемы данных и низкая финансовая прибыльность. Заказчики подобных проектов зачастую не готовы и не умеют работать с БД, которые уже на старте проекта достигают размеров в районе 200-300 Гб. Не могут ни сделать бэкап ни развернуть его.
С текстовым файловым хранилищем, особенно партиционированным, всё намного проще. Повредить его сложно. Восстановить легко. Протестировать или модифицировать легко. Получается аналог portable софта, работать с которым может человек без подготовки.

В моём тезисе про SQLite и альтернативы не было противопоставления. Придирка ни о чём. 

Mongo многим приходит в голову, когда нужно быстро искать по чему-то вроде ID и хранить привязанную к каждой такой записи неопределенную кучу разнородных данных. Для YT это может быть актуально. А может и не быть. Зависит от потребностей и планов бизнеса.

Конкретно для случая ОПа, до сотни миллионов записей я для начала попробовал бы сделать именно партиционированные текстовые файлы. Например, по двум первым "буквам" ID, если он гарантированно ASCII буквенно-цифровой. Искал бы построчным чтением с брейком в случае нахождения строки. С хорошим объемом RAM файлы будут в кеше ОС и всё должно быть быстро. А писал бы обычным для Unix 'my str' >> /target/file.txt.

Но всё нужно тестировать. И для  конкретно этой задачи тестирование альтернатив не выглядит проблемой. Для проверки эффективности каждого подхода должно хватить не более сотни строк кода.

Про подтверждение ответов. 

Это вообще к чему? Я тут не кандидатскую защищаю, а развлекаюсь на форуме. Как захотел, так и написал. Не нравится - напиши лучше 👍

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий