Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Извлечь случайную строку из 40Мб файла
 
 автор: CodeIgniter   (07.02.2011 в 23:28)   письмо автору
 
 

Всем привет! У меня вот есть файл 40 мб а то и больше как можно вытащить n - строку с файла, не загружая его целиком

  Ответить  
 
 автор: Trianon   (07.02.2011 в 23:34)   письмо автору
 
   для: CodeIgniter   (07.02.2011 в 23:28)
 

прочесть строки вплоть до n все равно придется.
как - читая файл построчно и считая строки.

  Ответить  
 
 автор: CodeIgniter   (07.02.2011 в 23:38)   письмо автору
 
   для: Trianon   (07.02.2011 в 23:34)
 

каким образом можно это реализовать? напишите пример плеез

  Ответить  
 
 автор: cheops   (07.02.2011 в 23:41)   письмо автору
 
   для: 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($fd4096);
    
// Искомая строка достигнута
    
if($i == $number)
    {
      
// Искомая строка
      
echo $buffer;
      
// Выходим из цикла
      
break;
    }
  }
  
// Закрываем файл
  
fclose($fd);
?>

  Ответить  
 
 автор: CodeIgniter   (07.02.2011 в 23:48)   письмо автору
 
   для: cheops   (07.02.2011 в 23:41)
 

а если мне нужно получить случайную строку но при этом мне ненадо открывать весь файл.
Какой выход из такого положения? Помогите оч надо

  Ответить  
 
 автор: cheops   (07.02.2011 в 23:59)   письмо автору
 
   для: CodeIgniter   (07.02.2011 в 23:48)
 

Подсчитайте количество строк в файле и сгенерируйте случайный индекс от 1 до этого количество. Далее используйте приведенный выше скрипт.
<?php
  
// Открываем файл
  
$fd fopen("text.txt""r");
  
// Проверяем корректность открытия файла
  
if(!$fd) exit("Не удалось открыть файл");
  
// Счетчик строк
  
$i 0;
  while(!
feof($fd))
  {
    
$i++;
    
// Читаем очередную строку 
    
$buffer fgets($fd4096);
  }
  echo 
"Количество строк - $i<br />";
  
// Закрываем файл
  
fclose($fd);
?>

  Ответить  
 
 автор: CodeIgniter   (08.02.2011 в 00:12)   письмо автору
 
   для: cheops   (07.02.2011 в 23:59)
 

а пример можно?

  Ответить  
 
 автор: cheops   (08.02.2011 в 00:15)   письмо автору
 
   для: CodeIgniter   (08.02.2011 в 00:12)
 

Хм... собственно пример подсчета количества строк приведен выше. Сгенерировать номер случайной строки можно при помощи скрипта
<?php
  $index 
rand(1$i);
?>

  Ответить  
 
 автор: Trianon   (08.02.2011 в 00:08)   письмо автору
 
   для: CodeIgniter   (07.02.2011 в 23:48)
 

поскольку чтобы случайным образом выбрать строку, нужно опираться на общее число строк в файле, то один раз прочитать файл целиком всё таки придется.

Если Файл не изменяется, либо изменяется достаточно редко (по сравнению с частотой обращений к нему) - имеет смысл прочитать файл не просто считая строки, но и параллельно запоминая позиции начала строк в другом файле (со строками одинакового размера). Фактически эта подготовительная операция не что иное,как создание индекса - позволяет в дальнейшем мгновенно спозиционироваться на любую из строк и прочесть только её, не тратя времени на чтение всего файла.

  Ответить  
 
 автор: cheops   (08.02.2011 в 00:13)   письмо автору
 
   для: Trianon   (08.02.2011 в 00:08)
 

Особенно этот прием хорош, если операция частая и завязана на посещение страницы, иначе действительно будет очень накладно лопатить по два раза на клик 40Мб на диске.

PS CodeIgniter, скрипты, приведенные выше этот ускоренный механизм не реализуют.

  Ответить  
 
 автор: Trianon   (08.02.2011 в 00:19)   письмо автору
 
   для: cheops   (08.02.2011 в 00:13)
 

я так и написал - если файл изменяется значительно реже, чем читается.

Кстати, бывают файлы , которые пополняются новыми строками в хвост. Начало середина не меняются. Логи к примеру.
Для них характерно то, что индекс можно не пререстраивать с нуля по всем 40Мб, а точно также дописать в хвост, пересчитав лишь добавленное.

  Ответить  
 
 автор: Красная_шляпа   (08.02.2011 в 00:11)   письмо автору
 
   для: CodeIgniter   (07.02.2011 в 23:48)
 

строки фиксированной длинны тогда зная размер файла можем определить количество записей затем случайное число смещение и чтение нужной записи

  Ответить  
 
 автор: cheops   (08.02.2011 в 00:14)   письмо автору
 
   для: Красная_шляпа   (08.02.2011 в 00:11)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования