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. Поэтому, если только файл в принципе помещается в память и достаточно часто используется - с диска он читается только один раз.
Вот только это не имеет ничего общего с обращением к физическому диску - это на усмотрение ОС. Дисковый кэш уже давным-давно реализован. При чтении блока, этот блок сохраняется в RAM, последующие запросы на чтение этого блока обрабатываются уже напрямую из RAM. Запись в файл, к слову, тоже осуществляется в памяти. На диск изменения (ака грязные страницы) сбрасываются через вызов fsync вручную или по таймеру или по достижении некоторого порогового числа этих грязных страниц.
PHP не экспортирует флаги вроде O_DIRECT. Поэтому, если только файл в принципе помещается в память и достаточно часто используется - с диска он читается только один раз.
5. freelsd - 13 Февраля, 2016 - 12:11:22 - перейти к сообщению
Мелкий пишет:
С точки зрения системного апи - да, получение дескриптора файла на чтение каждый раз новое.
Вот только это не имеет ничего общего с обращением к физическому диску - это на усмотрение ОС. Дисковый кэш уже давным-давно реализован. При чтении блока, этот блок сохраняется в RAM, последующие запросы на чтение этого блока обрабатываются уже напрямую из RAM. Запись в файл, к слову, тоже осуществляется в памяти. На диск изменения (ака грязные страницы) сбрасываются через вызов fsync вручную или по таймеру или по достижении некоторого порогового числа этих грязных страниц.
PHP не экспортирует флаги вроде O_DIRECT. Поэтому, если только файл в принципе помещается в память и достаточно часто используется - с диска он читается только один раз.
Вот только это не имеет ничего общего с обращением к физическому диску - это на усмотрение ОС. Дисковый кэш уже давным-давно реализован. При чтении блока, этот блок сохраняется в RAM, последующие запросы на чтение этого блока обрабатываются уже напрямую из RAM. Запись в файл, к слову, тоже осуществляется в памяти. На диск изменения (ака грязные страницы) сбрасываются через вызов fsync вручную или по таймеру или по достижении некоторого порогового числа этих грязных страниц.
PHP не экспортирует флаги вроде O_DIRECT. Поэтому, если только файл в принципе помещается в память и достаточно часто используется - с диска он читается только один раз.
А это можно как-то экспериментально проверить - читается ли он один раз или при каждом вызове fopen?
6. Мелкий - 13 Февраля, 2016 - 12:31:33 - перейти к сообщению
Поставьте xdebug, включите профилирование и посмотрите потом в kcachegrind'е где и сколько времени тратите.
Всяко полезнее будет, чем тыкать пальцем в небо "наверное, медленно с диска читается"
Всяко полезнее будет, чем тыкать пальцем в небо "наверное, медленно с диска читается"
7. freelsd - 13 Февраля, 2016 - 12:42:45 - перейти к сообщению
Мелкий пишет:
Поставьте xdebug, включите профилирование и посмотрите потом в kcachegrind'е где и сколько времени тратите.
Всяко полезнее будет, чем тыкать пальцем в небо "наверное, медленно с диска читается"
Всяко полезнее будет, чем тыкать пальцем в небо "наверное, медленно с диска читается"
Спасибо большое!