Считывание из большого файла - насколько велика нагрузка?

Статус
В этой теме нельзя размещать новые ответы.

Кинотавр

Новичок
Считывание из большого файла - насколько велика нагрузка?

Всех приветствую.

Возник такой вопрос.

Имеется файл размером несколько десятков Мбайт, порядка 50-80 Мбайт.
Это текстовый файл, в нем построчно хранятся некие данные.
Каждая строка файла - отдельный элемент данных.
Всего таких элементов 80-90 тыс. штук.

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

Это все.

Теперь вопрос. Насколько ресурсоемки такие способы хранения данных?
Можно ли без особого вреда для хостинга раз в день запускать такой скрипт?
Читается файл на 50-80 Мбайт, и формируется массив на 80-90 тыс. элементов - реально ли вообще отдавать скрипту такие объемы?

Прошу подсказать.
Спасибо.
 

zerkms

TDD infected
Команда форума
Теперь вопрос. Насколько ресурсоемки такие способы хранения данных?
возьми и измерь время выполнения и память.

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

Читается файл на 50-80 Мбайт, и формируется массив на 80-90 тыс. элементов - реально ли вообще отдавать скрипту такие объемы?
реально.


тема о сферическом коне в вакууме.
 

Кинотавр

Новичок
Проекта еще нет, надо сперва его сделать. Но сделать надо так, чтобы потом не переделывать, когда саппорт отключит аккаунт. Поэтому и спрашиваю.
 

zerkms

TDD infected
Команда форума
если есть выбор - тогда используй субд, а данные обрабатывай частями.

продолжение разговора о сферическом коне.
 

vovanium

Новичок
Кинотавр
Скорее всего это не будет работать так как хостеры ограничивают размер памяти (и судя по топику правильно делают)
Зачем для выбора одного элемента читать все в память?
Юзай базу для таких целей. Если же нельзя по каким-то причинам юзать базу. То сделай к индексный файл бинарный в котором будут храниться смещения строк в файле.

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

Будет на несколько порядков быстрее да и за память можно не переживать.
 

Фанат

oncle terrible
Команда форума
Вообще-то, считывать в память 80 мегабайт ради одной строчки - безумие, граничащее с головотяпством.

vovanium нафига там индексный файл? ему случайная строка нужна.
 

SiMM

Новичок
> vovanium нафига там индексный файл?
Если строки разной длины - позволит обойтись без чтения 80 мегабайт ради одной строки.
 

vovanium

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

С.

Продвинутый новичок
Автор оригинала: SiMM
> vovanium нафига там индексный файл?
Если строки разной длины - позволит обойтись без чтения 80 мегабайт ради одной строки.
Можно легко ткнуть в любое место файла и прочитать все влево и вправо до ограничителей строки.
 

SiMM

Новичок
> Можно легко ткнуть в любое место файла и прочитать все влево и вправо до ограничителей строки.
В этом случае длинные строки будут выпадать чаще коротких.
 

vovanium

Новичок
Можно легко ткнуть в любое место файла и прочитать все влево и вправо до ограничителей строки.
Да я не спорю можно много костылей придумать, если не очень важна равновероятностная выборка :)
представь что будет в файле типа
Код:
1
2222222222222222222222222222
33
а так вообще
PHP:
$elems = filesize($index_file) / 4;   // Количество элементов
fseek($fi, rand(0, $elems - 1) * 4);  // Смещение к случайному элементу
$tmp = unpack("Nint", fread($fi, 4)); // Читаем смещение строки для случайного элемента
fseek($fm, $tmp['int']);                // Смещение к искомой строке
$str = fgets($fm);				    // Читаем строку
имхо наиболее оптимальный вариант, 2 смещения, 2 чтения. можно в индекс еще длину строки добавить, но то уже мелочи
 

SiMM

Новичок
vovanium> можно много костылей придумать
Если всё в память не читать - то вообще похер :)
Кинотавр> Раз в день кроном запускается скрипт
 

vovanium

Новичок
Если всё в память не читать - то вообще похер
Ну это сейчас один раз в день, так как ТС предполагал, что процесс будет очень ресурсоемким, а если алгоритм позволяет хоть десятки раз в секунду выполнять, то кто знает :)
 

Фанат

oncle terrible
Команда форума
Перфекционизм головного мозга.
Один цепляется за свою дебильную идею с лишним файлом, Второй боится, что на случайной выборке из ста тыщ строк будут неравномерности. Два анекдота на сайте покажут два дня подряд. Хиросима от этого заново взорвется.
Я фигею.

-~{}~ 28.07.09 15:13:

С., зачем влево-то читать?
Зачем вообще читать до ограничителей? Почему просто не считать ну даже ДЕСЯТЬ килобайт с рандомной позиции в файле?
И в скрипте уже как угодно их разбивать.

Зачем усложнять примитивную задачу? Зачем притягивать к ней решение от другой, как вований делает?
 

vovanium

Новичок
Зачем притягивать к ней решение от другой, как вований делает?
Я же написал, костылей и эмуляций решения задачи может быть много, я предложил более менее правильный вариант, и не говорю что он самый лучший. Если создание индексного файла для тебе сложно, то как бы твои проблемы, для меня это так же примитивно как и создание любого другого файла.
 

dimagolov

Новичок
vovanium, дело не в сложности создания индексного файла, а в отсутствии смысла в этом в контексте данной задачи.

-~{}~ 28.07.09 12:07:

п.с. помни про бритву Оккама
 

dimagolov

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