Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Большие файлы и нагрузка на сервер

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: При использовании файлов вместо БД
phphel
Отправлено: 10 Сентября, 2013 - 21:53:26
Post Id


Новичок


Покинул форум
Сообщений всего: 46
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Здравствуйте.
Возник такой вопрос.

Есть движок игрового сайта.Игры располагаются в обычных txt файлах (вместо бд), ну тоесть не сами игры, а название, описание, размер и т.п
Для каждой категории отдельный файл.Тоесть для аркад arcady.txt, для гонок gonki.txt
Игры размещаются в формате по 1 на строку.Тоесть если в файле 10 строк, значит это 10 игр.

Теперь вопрос.Если скажем каждый из этих файлов весит более 1-2 mb, как сильно это повлияет на нагрузку сервера?
Ну тоесть в этом самом движке, например, что бы вывести на страницу определнное кол-во игр, сначала файл заносится в массив через file(), потом все это дело парсится и выводится.
Я так понимаю, что если скажем на сайт зайдут 10 человек, то скрипт 10 раз этот самый файл откроет, для того что бы вывести игры, или же только один раз?

Если он откроет 10 раз этот файл. то вопрос, как сделать что бы только 1 раз?Я так понимаю нужно копать в сторону flock и т.п, или может быть в сторону кэширования?
Вобщем, суть вопроса, как снизить нагрузку на сервер, ибо открывать каждый раз через file() 1-3 мб файлы слишком затратно для сервера, мне кажется...

(Отредактировано автором: 10 Сентября, 2013 - 21:55:56)

 
 Top
Balancer
Отправлено: 10 Сентября, 2013 - 22:27:20
Post Id



Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




Даже если размер «файловой базы» будет в считанные килобайты — и то БД будет уже быстрее. В случае мегабайтных размеров разница в скорости будет вообще несопоставимая.
 
 Top
phphel
Отправлено: 10 Сентября, 2013 - 22:42:32
Post Id


Новичок


Покинул форум
Сообщений всего: 46
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Никто с этим фактом не спорит ниразу Улыбка
Суть в том, что нужно оптимизировать уже созданный код, а он работает с файлами...
 
 Top
esterio
Отправлено: 11 Сентября, 2013 - 00:55:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




используйте сериализацию в таком случае
 
 Top
Мелкий Супермодератор
Отправлено: 11 Сентября, 2013 - 09:34:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




phphel пишет:
нужно оптимизировать уже созданный код

phphel пишет:
мне кажется

Нужно оптимизировать - значит есть проблема в производительности и она не устраивает уже.
Тогда делается профилирование и переписываются те фрагменты, что занимают слишком много времени суммарно. (пример из книги Файлуера о рефакторинге - больше всего времени выполнения занимал конструктор штатного класса дат, а не чего бы то ни было в основном коде. Потому что конструктор выполняется быстро, но вызывался слишком часто).

Если проблемы нет и просто интересно на будущее - перепишите всё на использование базы данных. Это единственное нормальные и адекватное решение.

phphel пишет:
на сайт зайдут 10 человек, то скрипт 10 раз этот самый файл откроет, для того что бы вывести игры, или же только один раз?

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

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

esterio пишет:
используйте сериализацию в таком случае

json, помнится, быстрее работает. Да и места (==памяти) занимает меньше.


-----
PostgreSQL DBA
 
 Top
esterio
Отправлено: 11 Сентября, 2013 - 09:47:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Мелкий пишет:
json, помнится, быстрее работает. Да и места (==памяти) занимает меньше.

Помниться статья на хабре с тестами. Походу они одинаково по скорости, или разница незначительная.
Но все же ТС Вам стоит переделать все с файлов на БД. Ибо с возрастанием нагрузкы файлы перестанут справляться со своей задачей. И я не поверю что Вы сможете реализовать все что есть в БД на файлах в ПХП
 
 Top
DelphinPRO
Отправлено: 11 Сентября, 2013 - 11:19:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




считывайте файлы построчно fgets, если в один момент времени нужна одна игра.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
phphel
Отправлено: 11 Сентября, 2013 - 16:30:06
Post Id


Новичок


Покинул форум
Сообщений всего: 46
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Мелкий, переписать можно конечно, и, наверное, даже нужно.
Но суть именно в том, что бы достичь максимальной производительности используя именно файлы.

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

Цитата:
используйте сериализацию в таком случае

Я честно говоря не вьеду, причем тут сериализация...
Можно подробнее мысль изложить пожалуйста?

А вообще, стоит ли игра свечь?
Если файлы будут не более 1-3 мб?БУдет ли это сильно затратно для сервера?Или можно оставить как есть?

(Отредактировано автором: 11 Сентября, 2013 - 16:32:33)

 
 Top
Мелкий Супермодератор
Отправлено: 11 Сентября, 2013 - 16:47:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




phphel пишет:
Так вроде бы все очевидно

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

Например, очевидно ли вам, что file заметно медленнее explode(PHP_EOL, file_get_contents('file'))? А это так.


-----
PostgreSQL DBA
 
 Top
phphel
Отправлено: 11 Сентября, 2013 - 16:59:39
Post Id


Новичок


Покинул форум
Сообщений всего: 46
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Насчет explode(PHP_EOL, file_get_contents('file')) не знал, учту.
Хотя потратив 1 минуту на гугл обнаружилась вот такая интересная статься по этому поводу - http://a-develop[dot]ru/blog/279 Улыбка

(Отредактировано автором: 11 Сентября, 2013 - 17:00:55)

 
 Top
Мелкий Супермодератор
Отправлено: 11 Сентября, 2013 - 17:08:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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


-----
PostgreSQL DBA
 
 Top
phphel
Отправлено: 12 Сентября, 2013 - 00:59:27
Post Id


Новичок


Покинул форум
Сообщений всего: 46
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




У кого еще какие соображения?Улыбка Кстати вопрос, заметил что если хранить данные в utf-8 то файл получается больше в два раза по сравнению скажем с win1251.
Cтоит ли хранить данные в win 1251?
 
 Top
caballero
Отправлено: 12 Сентября, 2013 - 01:04:51
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Cтоит ли хранить данные в win 1251?

не стоит


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
phphel
Отправлено: 12 Сентября, 2013 - 01:06:44
Post Id


Новичок


Покинул форум
Сообщений всего: 46
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Почему же?Перекодировать на выходе часть строки не долго, и не затратно, а вот вес итогового файла уменьшается почти вдвое...

Хотелось бы конкретики, почему не стоит Улыбка


Сейчас провел эксперимент, на одинаковом железе файл весом в 55mb (utf-8) функция file() прочитала за 1.5 сек.
А вот файл с тем же кол-вом строк, но в кодировке win-1251 (вес получился 34mb) за 1.1 сек...разница есть Улыбка

(Отредактировано автором: 12 Сентября, 2013 - 01:12:05)

 
 Top
caballero
Отправлено: 12 Сентября, 2013 - 01:23:30
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




перекодировать 55М тоже разница есть

юникод используется для устранения проблем с кодировками. размер файлов значения не имеет

а чтобы не было проблем со скоростью используются сервера баз данных
где не надо читать 55М для получения десятка строк


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB