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

seobeginner

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

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

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

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

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

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

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

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

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


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

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

В файле примерно ~ 1000000 строк => читаем строки с 130000 по 140000, если нету в этих строках нужной, читаем из +- n строк.
Или, например, при поиске, можно читать рандомно, например, файл весит 100 мб, и мы рандомно читаем по 5 мб, вероятность выпада нужного результата намного выше чем если читать по очереди.
 
Даже при таких объемах выгоднее использовать базу данных. Вот если всё весит не больше одного МБ, тогда можно и файлами
 
Даже при таких объемах выгоднее использовать базу данных. Вот если всё весит не больше одного МБ, тогда можно и файлами
Использование СУБД - не вариант (потому что БД будет копироваться на 10-100 сайтов, к примеру. настраивать везде БД - нет уж, увольте)

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

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

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

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

А как читать с определенной строки? Сколько не гуглил - кроме как file(), а это опять подргузка в оперативку.
Fopen (как и file_get_contents) может читать с определенного символа только, но не строки.
 
Использование СУБД - не вариант (потому что БД будет копироваться на 10-100 сайтов, к примеру. настраивать везде БД - нет уж, увольте)
Баз sqllite переносится простым копированием.
 
Мне надо, чтобы 20 зашедших в одно время человек не повесили VDS с 256 Мб оперативки, загрузив каждый файл на 10Мб.
Но и нагрузку на файловую систему не очень хочется (если каждый будет считать построчно файл).

Как быть? Или я хочу невозможного?
 
Мне надо, чтобы 20 зашедших в одно время человек не повесили VDS с 256 Мб оперативки, загрузив каждый файл на 10Мб.
Но и нагрузку на файловую систему не очень хочется (если каждый будет считать построчно файл).

Как быть? Или я хочу невозможного?
Вы хотите sqllite!
 
Баз sqllite переносится простым копированием.
Тем не менее, не везде она есть, не везде предусмотрена по умолчанию. На ВДС как минимум ее включать надо. Как-то заморачивался, получилось не с первого раза, так что отношение к ней не самое хорошее. С текстовыми файлами куда проще. И прошу, не надо меня посылать больше к СУБД.
Я прошу, что тут лучше выбрать из моих вариантов.
 
Давайте тогда поподробнее: структура данных и их размер.
 
Структура самая обычная:
url1::Название1::какие-то_данные::какие-то_данные::какие-то_данные
url2::Название2::какие-то_данные::какие-то_данные::какие-то_данные
..
urlN::НазваниеN::какие-то_данные::какие-то_данные::какие-то_данные

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

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

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

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