|
|
|
| Удаление строк
В файле 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($fr, 4096);
$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($fp, 4096);
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);
}
?>
|
это только удаление но оно нагружает даже мой домашний комп и в перезагрузку даже не бросает так заедает приходиться с провода вытаскивать кто поможет? | |
|
|
|
|
|
|
|
для: rafonets
(26.05.2011 в 12:19)
| | При таких объемах стараются путешествовать по файлу при помощи fseek() и rewind(). Проблема в том, что конец файла вы можете записать куда угодно, а вот начало сместить вряд ли получится.
PS А в связи с чем возникала эта задача? Может удобнее будет воспользоваться СУБД? Их собственно ради таких задач и создали. | |
|
|
|
|
|
|
|
для: cheops
(26.05.2011 в 14:19)
| | Эта идея пришла моему заказчику файлы если что можно и уменшить до 100 мб я понимаю что было бы лишнее вас просить но вы можете показать пример использования fseek() и rewind(). | |
|
|
|
|
|
|
|
для: rafonets
(26.05.2011 в 14:43)
| | Показать-то не сложно, но они не подходят вам... дело в том, что эти функции перемещают файловый указатель на произвольную точку (fseek) или в начало (rewind), в этом точке можно записать произвольную информацию, в том числе и конец файла. Но у вас же удаляемая информация в начале: вам нужно начало двигать, а это файловая система и её API не позволяют. | |
|
|
|
|
|
|
|
для: cheops
(26.05.2011 в 15:12)
| | То есть это невыполнимая задача? | |
|
|
|
|
|
|
|
для: rafonets
(26.05.2011 в 15:24)
| | Без того, чтобы не перегонять кучу информации из одного файла в другой в рамках лишь файловой системы - нет. Нужна хитрая надстройка, но это проще сразу СУБД использовать - она там не глючит и работать будет очень быстро, в отличие от самопальной. | |
|
|
|
|
|
|
|
для: cheops
(26.05.2011 в 15:40)
| | СУБД я тоже смогу сделать в файлах общего всего что там есть у клиента около 1 000 000 строк? ну вот как теперь подскажите?
И ему нужно чтобы файлы были ((((((( | |
|
|
|
|
автор: Гость67567 (26.05.2011 в 19:08) |
|
|
для: rafonets
(26.05.2011 в 18:18)
| | А из начала файла строки обязательно удалять? может проще запоминать позицию на которой остановились? | |
|
|
|
|
|
|
|
для: Гость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);
}
|
Благодарю всех сам разобрался | |
|
|
|