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
Форумы портала PHP.SU :: Версия для печати :: Загрузить файл в память для последующего использования (чтения через fopen)
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Загрузить файл в память для последующего использования (чтения через fopen)

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

1. freelsd - 13 Февраля, 2016 - 10:54:34 - перейти к сообщению
Есть api jот геоип, который ищет в файле информацию по определенному ип. Но с диска все это происходит очень медленно. Вопрос вот в чем: можно ли загрузить файл в память, чтобы к нему потому можно было обращаться как к обычному файлу (читать, писать и тд). Файл бинарный. Спасибо.
2. Мелкий - 13 Февраля, 2016 - 11:00:47 - перейти к сообщению
Если файл только читается - он и так с диска читается только при первом обращении, затем из памяти.
емнип, даже под виндами дисковый кэш работает.
3. freelsd - 13 Февраля, 2016 - 11:34:54 - перейти к сообщению
Мелкий пишет:
Если файл только читается - он и так с диска читается только при первом обращении, затем из памяти.
емнип, даже под виндами дисковый кэш работает.

Там, вроде каждое обращение к геоип базе это открытие файла заново. И в общем-то интересно, как бинарный файл в память загрузить для работы. По теме ничего особо толкового не нашел.
4. Мелкий - 13 Февраля, 2016 - 11:47:24 - перейти к сообщению
С точки зрения системного апи - да, получение дескриптора файла на чтение каждый раз новое.
Вот только это не имеет ничего общего с обращением к физическому диску - это на усмотрение ОС. Дисковый кэш уже давным-давно реализован. При чтении блока, этот блок сохраняется в RAM, последующие запросы на чтение этого блока обрабатываются уже напрямую из RAM. Запись в файл, к слову, тоже осуществляется в памяти. На диск изменения (ака грязные страницы) сбрасываются через вызов fsync вручную или по таймеру или по достижении некоторого порогового числа этих грязных страниц.

PHP не экспортирует флаги вроде O_DIRECT. Поэтому, если только файл в принципе помещается в память и достаточно часто используется - с диска он читается только один раз.
5. freelsd - 13 Февраля, 2016 - 12:11:22 - перейти к сообщению
Мелкий пишет:
С точки зрения системного апи - да, получение дескриптора файла на чтение каждый раз новое.
Вот только это не имеет ничего общего с обращением к физическому диску - это на усмотрение ОС. Дисковый кэш уже давным-давно реализован. При чтении блока, этот блок сохраняется в RAM, последующие запросы на чтение этого блока обрабатываются уже напрямую из RAM. Запись в файл, к слову, тоже осуществляется в памяти. На диск изменения (ака грязные страницы) сбрасываются через вызов fsync вручную или по таймеру или по достижении некоторого порогового числа этих грязных страниц.

PHP не экспортирует флаги вроде O_DIRECT. Поэтому, если только файл в принципе помещается в память и достаточно часто используется - с диска он читается только один раз.


А это можно как-то экспериментально проверить - читается ли он один раз или при каждом вызове fopen?
6. Мелкий - 13 Февраля, 2016 - 12:31:33 - перейти к сообщению
Поставьте xdebug, включите профилирование и посмотрите потом в kcachegrind'е где и сколько времени тратите.
Всяко полезнее будет, чем тыкать пальцем в небо "наверное, медленно с диска читается"
7. freelsd - 13 Февраля, 2016 - 12:42:45 - перейти к сообщению
Мелкий пишет:
Поставьте xdebug, включите профилирование и посмотрите потом в kcachegrind'е где и сколько времени тратите.
Всяко полезнее будет, чем тыкать пальцем в небо "наверное, медленно с диска читается"


Спасибо большое!

 

Powered by ExBB FM 1.0 RC1