|
|
|
| Всем привет! У меня вот есть файл 40 мб а то и больше как можно вытащить n - строку с файла, не загружая его целиком | |
|
|
|
|
|
|
|
для: CodeIgniter
(07.02.2011 в 23:28)
| | прочесть строки вплоть до n все равно придется.
как - читая файл построчно и считая строки. | |
|
|
|
|
|
|
|
для: Trianon
(07.02.2011 в 23:34)
| | каким образом можно это реализовать? напишите пример плеез | |
|
|
|
|
|
|
|
для: CodeIgniter
(07.02.2011 в 23:28)
| | Можно отталкиваться от следующего скрипта
<?php
// Номер строки
$number = 4;
// Открываем файл
$fd = fopen("text.txt", "rb");
// Проверяем корректность открытия файла
if(!$fd) exit("Не удалось открыть файл");
// Счетчик строк
$i = 0;
while(!feof($fd))
{
$i++;
// Читаем очередную строку
$buffer = fgets($fd, 4096);
// Искомая строка достигнута
if($i == $number)
{
// Искомая строка
echo $buffer;
// Выходим из цикла
break;
}
}
// Закрываем файл
fclose($fd);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(07.02.2011 в 23:41)
| | а если мне нужно получить случайную строку но при этом мне ненадо открывать весь файл.
Какой выход из такого положения? Помогите оч надо | |
|
|
|
|
|
|
|
для: CodeIgniter
(07.02.2011 в 23:48)
| | Подсчитайте количество строк в файле и сгенерируйте случайный индекс от 1 до этого количество. Далее используйте приведенный выше скрипт.
<?php
// Открываем файл
$fd = fopen("text.txt", "r");
// Проверяем корректность открытия файла
if(!$fd) exit("Не удалось открыть файл");
// Счетчик строк
$i = 0;
while(!feof($fd))
{
$i++;
// Читаем очередную строку
$buffer = fgets($fd, 4096);
}
echo "Количество строк - $i<br />";
// Закрываем файл
fclose($fd);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(07.02.2011 в 23:59)
| | а пример можно? | |
|
|
|
|
|
|
|
для: CodeIgniter
(08.02.2011 в 00:12)
| | Хм... собственно пример подсчета количества строк приведен выше. Сгенерировать номер случайной строки можно при помощи скрипта
<?php
$index = rand(1, $i);
?>
|
| |
|
|
|
|
|
|
|
для: CodeIgniter
(07.02.2011 в 23:48)
| | поскольку чтобы случайным образом выбрать строку, нужно опираться на общее число строк в файле, то один раз прочитать файл целиком всё таки придется.
Если Файл не изменяется, либо изменяется достаточно редко (по сравнению с частотой обращений к нему) - имеет смысл прочитать файл не просто считая строки, но и параллельно запоминая позиции начала строк в другом файле (со строками одинакового размера). Фактически эта подготовительная операция не что иное,как создание индекса - позволяет в дальнейшем мгновенно спозиционироваться на любую из строк и прочесть только её, не тратя времени на чтение всего файла. | |
|
|
|
|
|
|
|
для: Trianon
(08.02.2011 в 00:08)
| | Особенно этот прием хорош, если операция частая и завязана на посещение страницы, иначе действительно будет очень накладно лопатить по два раза на клик 40Мб на диске.
PS CodeIgniter, скрипты, приведенные выше этот ускоренный механизм не реализуют. | |
|
|
|
|
|
|
|
для: cheops
(08.02.2011 в 00:13)
| | я так и написал - если файл изменяется значительно реже, чем читается.
Кстати, бывают файлы , которые пополняются новыми строками в хвост. Начало середина не меняются. Логи к примеру.
Для них характерно то, что индекс можно не пререстраивать с нуля по всем 40Мб, а точно также дописать в хвост, пересчитав лишь добавленное. | |
|
|
|
|
|
|
|
для: CodeIgniter
(07.02.2011 в 23:48)
| | строки фиксированной длинны тогда зная размер файла можем определить количество записей затем случайное число смещение и чтение нужной записи | |
|
|
|
|
|
|
|
для: Красная_шляпа
(08.02.2011 в 00:11)
| | На самом деле мы не знаем фиксированной ли они длины, если действительно фиксированной, это было бы лучшим решением. | |
|
|
|