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

Форум PHP

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

 

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

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

тема: Удаление строк из начала гиганского файла
 
 автор: rafonets   (26.05.2011 в 12:19)   письмо автору
 
 

Удаление строк

В файле file.txt есть строки такого вида:
dfadfgadg
fsgsgf
dfgdsfg
sdfgsdfg
sdfgfdg

И так от 1гб до 5 гб около 500 000 и выше строк
мне не нужно каждый раз вытаскивать все 500 000 строк потому что к скрипту будет подключаться каждые 0.1-0.2 секунды раз
что теперь нужно?
а нужно с начало в Переменую $peremenaia засунуть первые две строки тоесть вот так
$peremenaia = "dfadfgadg-fsgsgf";
а в файле удалить те строки которые вызвали в переменую и уже используются
то есть это будут:
dfadfgadg
fsgsgf

как это сделать?

Есть несколько примеров они только удаляют строки но вызывают весь файл в массив
PHP:
скопировать код в буфер обмена

<?PHP
  $fw
=fopen('out.txt','w');
  
$fr=fopen('test.txt','r');
  
$fs=filesize('test.txt');
  while (!
feof($fr))  
   {
    
$str fgets($fr4096);
    
$curpos=ftell($fr);
    if (
$curpos==$fs) break;
    if (
check_string($str,$fr)) {fseek($fr,$curpos);continue;}
      else {
fseek($fr,$curpos);fwrite($fw,$str);}    
   }
   
fclose($fr);
   
fclose($fw);
function 
check_string($str,$fp)
{
  while (!
feof($fp))  
   {
    
$strf fgets($fp4096);
    if (
$strf==$str) return true;    
   }
  return 
false;
}
?>
 
 
 
<?
if ($id != "")
{
$id--;
$file=file("file.txt");
$fp=fopen("file.txt","w");
for(
$i=0;$i<sizeof($file);$i++)
{
if(
$i==$id)
{
unset(
$file[$i]);
}
}
fputs($fp,implode("",$file));
fclose($fp);
}
?>
 



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

  Ответить  
 
 автор: cheops   (26.05.2011 в 14:19)   письмо автору
 
   для: rafonets   (26.05.2011 в 12:19)
 

При таких объемах стараются путешествовать по файлу при помощи fseek() и rewind(). Проблема в том, что конец файла вы можете записать куда угодно, а вот начало сместить вряд ли получится.

PS А в связи с чем возникала эта задача? Может удобнее будет воспользоваться СУБД? Их собственно ради таких задач и создали.

  Ответить  
 
 автор: rafonets   (26.05.2011 в 14:43)   письмо автору
 
   для: cheops   (26.05.2011 в 14:19)
 

Эта идея пришла моему заказчику файлы если что можно и уменшить до 100 мб я понимаю что было бы лишнее вас просить но вы можете показать пример использования fseek() и rewind().

  Ответить  
 
 автор: cheops   (26.05.2011 в 15:12)   письмо автору
 
   для: rafonets   (26.05.2011 в 14:43)
 

Показать-то не сложно, но они не подходят вам... дело в том, что эти функции перемещают файловый указатель на произвольную точку (fseek) или в начало (rewind), в этом точке можно записать произвольную информацию, в том числе и конец файла. Но у вас же удаляемая информация в начале: вам нужно начало двигать, а это файловая система и её API не позволяют.

  Ответить  
 
 автор: rafonets   (26.05.2011 в 15:24)   письмо автору
 
   для: cheops   (26.05.2011 в 15:12)
 

То есть это невыполнимая задача?

  Ответить  
 
 автор: cheops   (26.05.2011 в 15:40)   письмо автору
 
   для: rafonets   (26.05.2011 в 15:24)
 

Без того, чтобы не перегонять кучу информации из одного файла в другой в рамках лишь файловой системы - нет. Нужна хитрая надстройка, но это проще сразу СУБД использовать - она там не глючит и работать будет очень быстро, в отличие от самопальной.

  Ответить  
 
 автор: rafonets   (26.05.2011 в 18:18)   письмо автору
 
   для: cheops   (26.05.2011 в 15:40)
 

СУБД я тоже смогу сделать в файлах общего всего что там есть у клиента около 1 000 000 строк? ну вот как теперь подскажите?
И ему нужно чтобы файлы были (((((((

  Ответить  
 
 автор: Гость67567   (26.05.2011 в 19:08)
 
   для: rafonets   (26.05.2011 в 18:18)
 

А из начала файла строки обязательно удалять? может проще запоминать позицию на которой остановились?

  Ответить  
 
 автор: rafonets   (26.05.2011 в 19:45)   письмо автору
 
   для: Гость67567   (26.05.2011 в 19:08)
 


        $f=file("file.txt");
            $kluch = $f[0].$f[1];
            $kluch = str_replace(" ","-",$kluch);
            $kluch = str_replace("0","",$kluch);
                for($i=0;$i<2;$i++){
                    unset($f[$i]);
                    $fp=fopen("file.txt","w");
                    fputs($fp,implode("",$f));
                    fclose($fp);
                }

Благодарю всех сам разобрался

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

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