Fopen или file_get_contents, что сэкономит оперативку?

Тема в разделе "Как сделать...", создана пользователем seobeginner, 18 дек 2014.

  1. seobeginner

    seobeginner ищу кнопку бабло

    Регистр.:
    5 июл 2008
    Сообщения:
    224
    Симпатии:
    57
    Возникла необходимость хранить данные в текстовой БД. (СУБД использовать не актуально, т.к. полей всего ничего, а вот строк много).

    Потестил на время и потребление памяти файл на 7Мб (10 000 строк)

    Самыми лучшими вариантами оказались классические - fopen и file_get_contents

    Сериализацию попробовал, но она меня ужаснула скоростью и потреблением памяти.

    file_get_contents + preg_match = отличная связка (самая быстрая, чтобы отыскать нужную строку). Но! Проблема в потреблении памяти. Т.е. он весь файл грузит в память (т.е все 7Мб в оперативке). Это прекрасно отображает функция memory_get_usage

    Fopen + fgets() - медленнее в разы (если нужная строка не в первых 500 строках), но при этом memory_get_usage показывает, что потребление памяти вообще мизерное (несколько килобайт).

    Вопрос к знатокам - действительно ли Fopen будет экономить оперативку.
    Как насчет нагрузки на файловую систему (вроде как построчное считывание не очень хорошо).

    Скорость работы меня устраивает и та, и другая, а вот потребление оперативки - критично. Поэтому хочется знать, что лучше выбрать.
     
  2. kise97

    kise97 Создатель

    Регистр.:
    22 июн 2012
    Сообщения:
    16
    Симпатии:
    2
    Используйте sqlite с подгрузкой в память и все.

    file_get_contents загружает весь файл и отдает его скрипту, отсюда и оперативка.
    fopen + чтение кусками позволяет читать файл кусками, например по 5 мб. Вы можете кусками читать файл и все.


    Как вариант, сделать "умное" чтение, например

    Нужно найти строку с ID = 134020

    В файле примерно ~ 1000000 строк => читаем строки с 130000 по 140000, если нету в этих строках нужной, читаем из +- n строк.
    Или, например, при поиске, можно читать рандомно, например, файл весит 100 мб, и мы рандомно читаем по 5 мб, вероятность выпада нужного результата намного выше чем если читать по очереди.
     
  3. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Даже при таких объемах выгоднее использовать базу данных. Вот если всё весит не больше одного МБ, тогда можно и файлами
     
    AlgoriVismut нравится это.
  4. seobeginner

    seobeginner ищу кнопку бабло

    Регистр.:
    5 июл 2008
    Сообщения:
    224
    Симпатии:
    57
    Использование СУБД - не вариант (потому что БД будет копироваться на 10-100 сайтов, к примеру. настраивать везде БД - нет уж, увольте)

    Хм, интересный вариант. Мне нужно сверху будет выбирать последовательно нужные строки в том же порядке (н-р, для формирования категорий)
    В принципе fopen + fread ($f, 4096) - будет читать последовательно по 4Кб. Если не набрались нужные даные, читаем следующие 4Кб.

    А как читать с определенной строки? Сколько не гуглил - кроме как file(), а это опять подргузка в оперативку.
    Fopen (как и file_get_contents) может читать с определенного символа только, но не строки.
     
  5. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    896
    Симпатии:
    535
    Баз sqllite переносится простым копированием.
     
  6. seobeginner

    seobeginner ищу кнопку бабло

    Регистр.:
    5 июл 2008
    Сообщения:
    224
    Симпатии:
    57
    Мне надо, чтобы 20 зашедших в одно время человек не повесили VDS с 256 Мб оперативки, загрузив каждый файл на 10Мб.
    Но и нагрузку на файловую систему не очень хочется (если каждый будет считать построчно файл).

    Как быть? Или я хочу невозможного?
     
  7. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    896
    Симпатии:
    535
    Вы хотите sqllite!
     
  8. seobeginner

    seobeginner ищу кнопку бабло

    Регистр.:
    5 июл 2008
    Сообщения:
    224
    Симпатии:
    57
    Тем не менее, не везде она есть, не везде предусмотрена по умолчанию. На ВДС как минимум ее включать надо. Как-то заморачивался, получилось не с первого раза, так что отношение к ней не самое хорошее. С текстовыми файлами куда проще. И прошу, не надо меня посылать больше к СУБД.
    Я прошу, что тут лучше выбрать из моих вариантов.
     
  9. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    896
    Симпатии:
    535
    Давайте тогда поподробнее: структура данных и их размер.
     
  10. seobeginner

    seobeginner ищу кнопку бабло

    Регистр.:
    5 июл 2008
    Сообщения:
    224
    Симпатии:
    57
    Структура самая обычная:
    url1::Название1::какие-то_данные::какие-то_данные::какие-то_данные
    url2::Название2::какие-то_данные::какие-то_данные::какие-то_данные
    ..
    urlN::НазваниеN::какие-то_данные::какие-то_данные::какие-то_данные

    10 000 подобных строк ~ 7Мб

    Как я думаю, нужно сделать доп. файл, где будет хранится
    url1=1
    url2=124
    ...
    urlN=M

    Где 1, 124, M- начало строки данного url

    Сначала считываем этот файл с "оглавлением". Затем из второго читаем лишь кусочек текста.