Массивы?

REMO

Guest
Удаление строк в начале фаила?

Считываю содержание фаила в массив, массив получится из 5000 элементов. Потом удаляю 10 первых элементов этого массива и оставшийся массив закатываю обратно в фаил.

Насколько это напряжная операция, в плане нагрузки на сервер? Возможно как то по другому, удалить 10 первых строк фаила?
 

Alkinoy

Guest
а скока раз в секунду ты это делаешь? Какой сервер?
 

REMO

Guest
речь не о секундах, скажем о минутах... какой сервер не могу сказать, не знаю...

но понимаю, что так делать не совсем правильно, лучше бы удалять из фаила строки, а как это сделать не читая весь фаил в массив я не знаю (
 

REMO

Guest
пробовал, фаилы лучше подходят в этой ситуации...
 

REMO

Guest
Я так понимаю строку удалить нельзя другими средствами как через массив, тогда остается вопрос насколько это напряжно для сервера считать из фаила массив размреом 5000 элементов?
 

fixxxer

К.О.
Партнер клуба
а зачем читать сразу весь файл?
подразумевается какая-то дополнительная хитрая обработка данных?
 

REMO

Guest
а как еще? если я прочитаю не весь фаил, то как я смогу удалить строки?
 

Фанат

oncle terrible
Команда форума
самое главное - не морочиться с массивом.
считывать в строку.
Так будет ГОРАЗДО быстрее.
а отрезать первые 10 строк - это как два пальца об асфальт.
находим в цикле десятый перевод строки с помощью strpos и отрезаем от этого места.

зы. может, он еще и через fgetc читает.
 

REMO

Guest
Автор оригинала: fixxxer
используя временный файл
и что временный фаил? все равно придется в фаил заново писать то, что остается, т.е. придется это где то хранить, я знаю только массив.

Может я чего то не догнал, объясни поподробнее.
 

REMO

Guest
Автор оригинала: Фанат
самое главное - не морочиться с массивом.
считывать в строку.
Так будет ГОРАЗДО быстрее.
а отрезать первые 10 строк - это как два пальца об асфальт.
находим в цикле десятый перевод строки с помощью strpos и отрезаем от этого места.

зы. может, он еще и через fgetc читает.
Т.е. ты предлагаешь считать фаил из 5000 строчек в строку? А это точно лучше, чем читать его в массив? Я конечно не адвансед, но что то это вызывает сомнения (
 

REMO

Guest
Автор оригинала: Yuriy_S
вникни в то, что тебе написал фанат.

strpos()
Я уже вникнул и оценил... Но меня замучали по пути сомнения, как так читать фаил в 5000 строк в строку и потом его обрабатывать... Это же хуже чем массив, я не прав?
 

StUV

Rotaredom
замучали по пути сомнения
а ты попробуй :)
PHP:
<?php 
function getmicrotime(){ 
  list($usec, $sec) = explode(" ",microtime()); 
  return ((float)$usec + (float)$sec); 
} // (c) Crazy =)

$str = "sdfasdjfhl;sdfljkgsdkfjglskdfjgklsdjfgksdjfg\n\r";

$h = fopen('f.txt', 'w');
for ($i=0; $i<10000; $i++)
	fwrite($h, $str);
fclose($h);

$h = fopen('f.txt', 'r');
$b = getmicrotime();
$s = fread($h, filesize('f.txt'));
$e = getmicrotime();
fclose($h);
echo $e-$b;
echo '<BR>';

$b = getmicrotime();
$s = file('f.txt');
$e = getmicrotime();
echo $e-$b;
echo '<BR>';
?>
примеры выполнения:

0.0036920309066772
0.046075940132141

0.003788948059082
0.033845901489258
 

fog

Рыцарь Джедай
Файл может оказаться слишком большим, поэтому в память его лучше не читать. Как сказал Фанат, можно сделать через Fgets. Я себе это представляю так: читатем по строке, во временный файл, пропуская первые 10 строк, затем переименовываем временный файл в оригинал. Получается файл без первых 10 строк. При этом читать файл полностью никуда не нужно.
 

REMO

Guest
А если использовать такой код, он отличается от вышеприведенного, тем что getmicrotime(); в случаем чтения фаила в строчку выведены за fopen,fclose. Я думаю это справедливо, т.к. во втором случае они просто скрыты, но присутствуют.

Так вот при таком коде результаты такие:

0.48492503166199
0.1397430896759

0.49172496795654
0.15040302276611

PHP:
<?php 
function getmicrotime(){ 
  list($usec, $sec) = explode(" ",microtime()); 
  return ((float)$usec + (float)$sec); 
} // (c) Crazy =) 

$str = "sdfasdjfhl;sdfljkgsdkfjglskdfjgklsdjfgksdjfg\n\r"; 

$h = fopen('f.txt', 'w'); 
for ($i=0; $i<10000; $i++) 
    fwrite($h, $str); 
fclose($h); 

$b = getmicrotime(); 
$h = fopen('f.txt', 'r'); 
$s = fread($h, filesize('f.txt')); 
fclose($h); 
$e = getmicrotime(); 
echo $e-$b; 
echo '<BR>'; 

$b = getmicrotime(); 
$s = file('f.txt'); 
$e = getmicrotime(); 
echo $e-$b; 
echo '<BR>'; 
?>
Понятно, что при чтении фаила в строчку это занимает много времени, но если использовать временный фаил, как предлагает fog, то жрет мало памяти.

А в случае чтения фаила в массив, меньше времени, но много памяти.

Возникает вопрос, чем жертовать и что предпочесть? Время или память?
 

Фанат

oncle terrible
Команда форума
REMO, проверь свои результаты.
то, что у тебя получилось - бред.

Ты уже и сам пишешь, что в случае со строкой надо только открыть файл, прочитать и закрыть!
а в случае с массивом надо, извините, еще и распарсить в массив! И как это, по-твоему, может оказаться медленнее?

Ты оказался один такой уникальный, у которого меньшее количество операций занимает больше времени.
Пойди проспись и повтори опыт.

fog, не надо писать глупостей.
я писал, и это поймет любой человек с каплей мозга в голове, что fgets - самое тормозное решение!

Если уж и делать борчную систему, то не строчками, а большими кусками - в мегабайт, например.
А не чайной ложкой.
 

REMO

Guest
2Фанат

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

Насчет распасить. Тут я полностью согласен, но почему на деле получается одно, а в теории должно получаться другое я не знаю ((
 
Сверху