Увеличить скорость удаления строки

Тема в разделе "PHP", создана пользователем dig555, 20 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    363
    Симпатии:
    148
    Очень простая задачка. Есть файл strings.txt. В нём порядка 200-400К(!) строк. Задача - во время выполнения определённого процесса удалять первую строку из файла. Наваял простенькое решение:
    PHP:
    <?
    while (
    не достигнут результат){

    $file="strings.txt";
    $allkeys=file($file);
    echo 
    "Первая строка ".$allkeys[0]."<br />";

    //Совершаем какое-то действие c $allkeys[0]

    //Удаляем строку и перезаписываем файл

    unset($allkeys[0]);
    unlink($file);
    foreach(
    $allkeys as $one=>$two){
    $fp=fopen($file,"a+");
    fwrite($fp,$two);
    fclose($fp);
    }
    }
    ?>
    Проблема в том, что файл очень большой. И постоянное чтение/перезапись отнимает очень много времени. Подскажите, как записывать все строки кроме удалённой целиком, а не построчно. Может строкой или ещё как. Главное - максимальное быстродействие.
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    file_put_contents()
    Массив сливаешь при помощи implode().
     
    dig555 нравится это.
  3. cashmaniac

    cashmaniac Постоялец

    Регистр.:
    12 янв 2007
    Сообщения:
    64
    Симпатии:
    5
    я бы поискал другой способ
    например хранить в другом файле смещение по первому
    каждый раз переписывать 2-3М неизящно как-то
     
  4. localhost:80

    localhost:80 Постоялец

    Регистр.:
    4 дек 2008
    Сообщения:
    102
    Симпатии:
    15
    хранить этот файл в оперативной памяти
     
  5. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    засунь все в БД
    быстро получится ( и как тебя памяти хватает заносить столько строк в массив ? что за хостер ? )
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    400к строк, при условии в 200 байт на строку (что в принципе очень много) - это 76 метров.
    Не такой уж и фантастический объем :)
     
  7. Knowstas

    Knowstas Прохожие

    Попробуй
    Код:
    <?php
      $file = 'strings.txt';
      $f = fopen($file,'r+');
      $first = fgets($f);
      printf("First string:%s\n",$first);
      $f2 = fopen($file.'.tmp','w');
      while(!feof($f)) {
        $s = fread($f,4096);
        fwrite($f2,$s);
      }
      fclose($f);
      fclose($f2);
      unlink($file);
      rename($file.'.tmp',$file);
    ?>
    
     
  8. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    363
    Симпатии:
    148
    Всем спасибо, проблемка давно решена. Прошу закрыть тему.
     
  9. verissimo

    verissimo

    Регистр.:
    26 сен 2006
    Сообщения:
    438
    Симпатии:
    139

    Как решил-то? Каким способом из перечисленных?
     
  10. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    363
    Симпатии:
    148
    Первым же из предложенных. Т.е. способом PHP_Master'a.
    PHP:
     <?
    while (не достигнут результат){
    $file="strings.txt";
    $keys=file($file);
    echo "First".$keys[0]."<br />";
    //Совершаем какое-то действие c $keys[0]
    //Удаляем строку и перезаписываем файл
    unset($keys[0]);
    unlink($file);
    $str_keys=implode($keys);
    file_put_contents($file,$str_keys);
    }
    ?> 
     
Статус темы:
Закрыта.