Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Основы PHP...

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Открыть новую тему     Написать ответ в эту тему

Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Таблица большая, поэтому перебор не подходит, надо как-то иначе, быстрее

почему? просто подготовьте ее заранее - отсортировать данные, к примеру, создать индекс.
большая - сколько?
 

Цитата:
Может быть лучше занести таблицу в базу, быстрее будет?  

ну либо так. она то и сделает индексы и остальное, если расскажите ей как.

Всего записей: 12577 | Зарегистр. 20-09-2014 | Отправлено: 22:28 11-05-2022
Vladsvn

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Цитата:
Таблица большая, поэтому перебор не подходит, надо как-то иначе, быстрее
 
почему? просто подготовьте ее заранее - отсортировать данные, к примеру, создать индекс.
большая - сколько?
В таблице 200 тысяч записей, весит 2.5Мб. Левая колонка, по которой идет поиск, отсортирована по возрастанию.
 
А вот относительно индекса, я Вашу мысль не понял. Если мы говорим не о базе, а о чистом РНР, то в этом смысле я даже не встречал понятия индексирования. Что Вы имели в виду?

Всего записей: 83 | Зарегистр. 07-09-2016 | Отправлено: 09:28 12-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
В таблице 200 тысяч записей, весит 2.5Мб.

фигня
 

Цитата:
Левая колонка, по которой идет поиск, отсортирована по возрастанию.

тогда в чем проблема с поиском?
 

Цитата:
Что Вы имели в виду

самостоятельно создаете индекс и сохраняете его. используете для поиска.
вам тогда не нужно будет даже считывать весь файл, а сразу считываете нужную строку через fopen, fseek, fread
 
например https://ru.wikipedia.org/wiki/B-дерево
а можно, что проще, хранить позиции определенных значений, чтобы стартовать уже не с нуля.
но 2.5 мегабайта это фигня, поверьте.

Всего записей: 12577 | Зарегистр. 20-09-2014 | Отправлено: 09:33 12-05-2022 | Исправлено: Mavrikii, 09:40 12-05-2022
Vladsvn

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый вечер!
 

Цитата:
Цитата:
В таблице 200 тысяч записей, весит 2.5Мб.
 
фигня
Вы оказались совершенно правы, а в целом расклад такой:
- Загрузка файла $ipv4 = file_get_contents('my-geo-2kol.csv');  4 мс;
- Создание массива $m_ipv4 = explode("\r\n", $ipv4); 37 мс;
- Перебор в цикле 93 мс.
Всего 134 мс.
 
Как ни удивительно, но если вместо двух первых операций использовать $m_ipv4 = file('my-geo-2kol.csv'), то совершенно ничего не меняется.
 
Перебор я ускорил путем изменения инкремента: сначала проходим цикл с инкрементом 10000 и находим нужную область, потом ее уточняем с инкрементом 1000, 100, 10 и 1. В итоге время поиска сократилось до 1 мс.
 
Таким образом, самой медленной операцией остается создание массива.  
 
По идее, можно с помощью отдельного скрипта заранее сохранить в текстовом файле массив, а потом его извлечь через unserialize(file_get_contents('array.txt')), но получилось 56мс. То есть, еще медленнее.
 
Похоже, что простых способов ускорения больше нет и на достигнутом стоит остановиться?    
 
 

Всего записей: 83 | Зарегистр. 07-09-2016 | Отправлено: 22:15 15-05-2022 | Исправлено: Vladsvn, 22:36 15-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
что простых способов ускорения больше нет и на достигнутом стоит остановиться?

создать свой индекс, хотя бы простой:
сохранить положения определенных инкрементов в файле, чтобы потом просто вычитывать нужный кусок. можно и разбирать файл на несколько. но это все равно быстро. если же происходит очень часто - держать в памяти. либо в бд или кэширующем сервере (redis/memcached)
 

Цитата:
unserialize(file_get_contents('array.txt'))

тогда уж лучше JSON. скорить чтение можно бинарной упаковкой.
https://www.php.net/manual/en/function.pack.php

Всего записей: 12577 | Зарегистр. 20-09-2014 | Отправлено: 22:36 15-05-2022 | Исправлено: Mavrikii, 23:00 15-05-2022
Vladsvn

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
тогда уж лучше JSON
json_decode занял 65 мс. Т.е, еще больше.
unserialize(base64_decode($text)) столько же.
 

Цитата:
происходит очень часто - держать в памяти
Происходит при каждом открытии любой страницы сайта, поэтому я бы с удовольствием прописал кеширование всего этого РНР-скрипта в .htaccess, но ведь он не статический, и в .htaccess, как я понимаю, прописывается не файл, а расширение. То есть, это не возможно.
 
Но можно выделить операцию по загрузке файла и формированию массива в отдельный файл, который инклудить в основной скрипт. Этому файлу дать какое-то нестандартное расширение (типа .s5s), и для этого расширения в .htaccess прописать кеширование и подключить это расширение к РНР.
 
Возможно такое осуществить?
 
   
 
 
 

Всего записей: 83 | Зарегистр. 07-09-2016 | Отправлено: 23:00 15-05-2022 | Исправлено: Vladsvn, 23:01 15-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Происходит при каждом открытии любой страницы сайта, поэтому я бы с удовольствием прописал кеширование всего этого РНР-скрипта в .htaccess, но ведь он не статический, и в .htaccess, как я понимаю, прописывается не файл, а расширение. То есть, это не возможно.

если информация выводится по разному в зависимости от каких то настроек, то нет, не статический.
 

Цитата:
Возможно такое осуществить?

и нет смысла, потому что не понимаете, как идет взаимодействие между php интерператором и http сервером. он кэширует то, что передается пользователю, а не что грузит сам php скрипт.
 

Цитата:
ускорить чтение можно бинарной упаковкой.
https://www.php.net/manual/en/function.pack.php

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

Всего записей: 12577 | Зарегистр. 20-09-2014 | Отправлено: 23:02 15-05-2022 | Исправлено: Mavrikii, 23:15 15-05-2022
Vladsvn

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
и нет смысла, потому что не понимаете, как идет взаимодействие между php интерператором и http сервером. он кэширует то, что передается пользователю, а не что грузит сам php скрипт.
Да, это моя большая ошибка!  
Спасибо!

Всего записей: 83 | Зарегистр. 07-09-2016 | Отправлено: 23:10 15-05-2022
Vladsvn

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
хотите быстрее - разбейте файл на несколько и читайте именно тот, что вам нужен.
Как всегда, Вы оказались правы, и мне следовало бы сразу последовать Вашему совету. В итоге все сократилось и ускорилось, И общее время исполнения скрипта стало меньше 2 мс. По сравнению с первоначальными 130 мс это заметное достижение.  
 
Еще раз Спасибо!  

Всего записей: 83 | Зарегистр. 07-09-2016 | Отправлено: 14:34 19-05-2022
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Компьютерный форум Ru.Board » Интернет » Web-программирование » Основы PHP...


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru