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

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

dig555

Постоялец
Регистрация
22 Июн 2007
Сообщения
365
Реакции
160
Очень простая задачка. Есть файл 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);
}
}
?>

Проблема в том, что файл очень большой. И постоянное чтение/перезапись отнимает очень много времени. Подскажите, как записывать все строки кроме удалённой целиком, а не построчно. Может строкой или ещё как. Главное - максимальное быстродействие.
 
file_put_contents()
Массив сливаешь при помощи implode().
 
я бы поискал другой способ
например хранить в другом файле смещение по первому
каждый раз переписывать 2-3М неизящно как-то
 
хранить этот файл в оперативной памяти
 
засунь все в БД
быстро получится ( и как тебя памяти хватает заносить столько строк в массив ? что за хостер ? )
 
400к строк, при условии в 200 байт на строку (что в принципе очень много) - это 76 метров.
Не такой уж и фантастический объем :)
 
Попробуй
Код:
<?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);
?>
 
Всем спасибо, проблемка давно решена. Прошу закрыть тему.
 
Как решил-то? Каким способом из перечисленных?
Первым же из предложенных. Т.е. способом 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);
}
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху