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

S3
На сайте с 29.03.2012
Offline
328
#61
Алеандр #:
Это не максимально эффективное решение, при том, что в структуре есть данные, которые нужно разделить - их правильнее разделять построчно, если уж их пишете все в один файл и читать так же построчно. Построчное чтение легче, проще, может быть завершено по результату найденного вхождения и не потребует постоянной загрузки всего файла в память с последующим циклом проверки этих данных.

Еще раз - это ВООБЩЕ не оптимальное решение! цль была - примерно оценить скорость чтения записи в сравнении с БД.  И даже в таком варианте я признаю, что это сопоставимо. Если грамотно организовасть файловую систему, оптимизировать запись и чтение - это может быть быстрее, чем использовать БД. По крайней мере на небольших обьемах и сопоставимо по потреблению памяти.  Так понятнее? Не в рамках вопроса пытаться написать оптимальный скрипт на базе кода который я привел - он не для этого был написан.

Алеандр #:
Какое отношение роллбэк имеет к статично размещенному в директории файлу?

Я могу затереть занные в файле, могу многократно писать одно и тоже, могу удалить случайно файл, могу записать в него недопустимые символы и он перестанет читаться.... Все это нужно предусматривать. А при работе с SQL все это уже есть

Алеандр #:
Организация правильности БД никаким образом не влияет на отказоустойчивость базы

Влияет. все то что я написал выше. Например достаточно тип поля сделать уникальным и я избавляюсь от необходимости каждый раз проверять, есть ли такой айди в таблице. Добавление в CONSTRAIN ONDELETE Cascade - упростит мне очистку базу от ненужных данных. То есть вся та работа, которяа должна будет сделана при работе с файлами при работе с БД УЖЕ реализована. Да банальный бэкап обычно есть на любом хостинге. Наверное, давно не работал но сомневаюсь, что я ошибаюсь. 
Так что никакой гипотетичности. Все это пройдено собственными граблями на проектах с месячными бюджетами за который этот форум можно купить десяток раз. Поэтому я так критически отношусь к идее работы с файлами  в данном случае. 

Алеандр
На сайте с 08.12.2010
Offline
196
#62
Shelton724 #:

Ну как показала практика, разницы практически нет. +-10% роли не играют при примерно одинаковых итоговых объёмах.

Тут сам факт, время создания бэкапа будет разное и зависеть от многих факторов. В процентах разницу не замерял, спорить не буду. Да и в целом, бэкап - это вообще не особо про скорость, так что не имеет сильно существенного значения.
Алеандр
На сайте с 08.12.2010
Offline
196
#63
Sly32 #:

Поэтому я так критически отношусь к идее работы с файлами  в данном случае. 

Чет я понаписал, понаписал в ответ аргументы. А теперь подумал, да какой смысл. Вы просили поделиться реальным опытом, я поделился. В ответ, начинается выдумывание гипотетически возможных проблем там, где они могут быть при любой технологии в силу кривых ручонок не специалистов и тех, кто просто напросто не знает другие технологии и не пробовал их на практике. Так что нет, спасибо, я пас в таком обсуждении, где разумное объяснение извращается до бессмысленного даже с точки зрения банальной логики.

S3
На сайте с 29.03.2012
Offline
328
#65
Алеандр #:

Чет я понаписал, понаписал в ответ аргументы. А теперь подумал, да какой смысл. Вы просили поделиться реальным опытом, я поделился. В ответ, начинается выдумывание гипотетически возможных проблем там, где они могут быть при любой технологии в силу кривых ручонок не специалистов и тех, кто просто напросто не знает другие технологии и не пробовал их на практике. Так что нет, спасибо, я пас в таком обсуждении, где разумное объяснение извращается до бессмысленного даже с точки зрения банальной логики.

Ваше право. В любом случае, спасибо за интересную дискуссию и что пошарили свой опыт. Лично мне было интересно и полезно. 

S3
На сайте с 29.03.2012
Offline
328
#66
Sly32 #:

Результат выполнения для поиска по файлу с примерно полмиллиона записей:

Start script
Found file 40000 for checking ip 49342
Count of records: 433209
This ip(49342) was blocked for download
Execution time: 0.04430103302001953

Это локально, без всяких HTTP запросов, на 4-х ядерном core i5 10gen 16RAM
Мне кажется, сопоставимо со скоростью запроса в БД. Может и имеет место быть такой подход

Подытоживая, нашел время проверить поиск по аналогичной БД на этой же машине. Стэк - Postrgesql 14, проиндексированная таблица, коннект с помощью SQLAlchemy. Скорость поиска в таблице с 1100000 строковых записей длиной 30 символов:

Start finder
[(Id(id=1000201, ip='mIiVBR23U2dooVjRzmCn0eC8a4XMcg'),)]
Execution time: 0.0586090087890625
[(Id(id=5, ip='wHx0pgTK4kOoI9nc7dp9b9NV7uBqnn'),)]
Execution time: 0.004904031753540039
[]
Execution time: 0.004606962203979492

То есть в худшем случае результат сопоставим, в лучшем - на порядок быстрее при количестве записей в 2 раза большем 

Все-таки база побеждает) Да и кода там меньше получается.

S3
На сайте с 29.03.2012
Offline
328
#67

И кстати, JOIN еще одной таблицы, например, если я хочу добавить еще  описание, хранящееся отдельно - не сильно увеличивает скорость

Результат выполнения такого кода 

    @timer
    def get_id(self, ipid):
        stmt = (
            select(BlockedID.ip_id, Description.url)
            .join(Description, Description.blocked_id == BlockedID.id, isouter=True)
            .where(BlockedID.ip_id == ipid))
        with Session() as session:

            print("="*120)
            print(stmt)
            result = session.execute(stmt).all()
            print("-" * 120)
            print(result)

что генерит запрос типа

SELECT blocked_id.id, blocked_id.ip_id, blocked_id.title, description.url
FROM blocked_id LEFT JOIN description ON description.blocked_id = blocked_id.id
WHERE blocked_id.ip_id = 'wHx0pgTK4kOoI9nc7dp9b9NV7uBqnn';

========================================================================================================================
SELECT blocked_id.ip_id, description.url
FROM blocked_id LEFT OUTER JOIN description ON description.blocked_id = blocked_id.id
WHERE blocked_id.ip_id = :ip_id_1
------------------------------------------------------------------------------------------------------------------------
[('1234456', 'http://tut')]
Execution time: 0.006269931793212891

Для миллиона записей совсем некритично. Сам HTTP запрос будет занимать намного больше времени,  Получение результата - малая часть в процентном отношении ко всему времени. 


В итоге получаю очень простой код,  хорошую надежность, простой бэкап данных, чем в случае работы с файлами

Aisamiery
На сайте с 12.04.2015
Offline
302
#68
Sly32 #:
Все-таки база побеждает) Да и кода там меньше получается.

А если при этом всем еще вместо постгри взять например keydb?

KeyDB - The Faster Redis Alternative
KeyDB - The Faster Redis Alternative
  • docs.keydb.dev
KeyDB is meant to handle heavy workloads with a single node benchmarking at over 1 million ops/sec. KeyDB is a multithreaded database and will outperform Redis on a per-node basis. Multiple Persistence Options Periodically dump the dataset to disk or by appending each command to a disk-based log. Durability preferences for RDB and AOF...
Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
S3
На сайте с 29.03.2012
Offline
328
#69
Aisamiery #:

А если при этом всем еще вместо постгри взять например keydb?

Думаю будет вообще летать)
На семинаре  от компании Postgres Professional очень обижались на постгри вместо правильного "постгре(и)с" 

Почему то все считают что раз PostgreSQL  то надо отбрасывать 3 буквы, но это не совсем верно) Да  и несильно к делу относится. На noSQL базах не проверял, впрочем очевидны их преимущества по скорости. SQL  и файлы в одной лиге, поэтому  интересно было их сравнить

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