Работа с файлами

DNiS

Новичок
Работа с файлами

Есть фаил(file1.txt) в котором есть строки, а в каждой строке содержится число(любое) и слова(тоже любые), как написать на пхп, чтоб все цифры удалились из файла, и создался фаил(file2.txt) уже без цифр, но со словами???
 

sergadm

Новичок
типа так
<?php
$fd=fopen("file1.txt","r");
$str=fread($fd,filesize("file1.txt"));
fclose($fd);
$str=preg_replace("/\d/","",$str);
$fd=fopen("file2.txt","w");
fwrite($fd,$str);
fclose($fd);
?>
 

Altex

Новичок
Кто-нибудь думал об оптимизации этого куска кода?
 

Crazy

Developer
А зачем его оптимизировать? Ты его используешь и ощущаешь нехватку скорости?
 

Altex

Новичок
Оптимизировать - для красоты. Нехватку памяти/скорости можно ощутить при километровом файле.
 

.des.

Поставил пиво кому надо ;-)
Altex а есть какие то предложения ?

На самом деле этот кусок вполне оптимизирован. И каких то принципиальных улучшений даже при "километровых" файлах нет.


Кстати, буквально вчера.. в одном из топиков упоминали о том, что преждевременная оптимизация есть зло - поищи :)
 

Altex

Новичок
*)тесты проводились на 10МБ бинарном файле
*) над каждым из закомментированных кусков написоно время (среднее) выполнения этого куска и ~ объем памяти, дополнительно занимаемый апачем при обработке скрипта

PHP:
<?php

function timer($reset = false) {
global $TIMER;
if ($reset) $TIMER = 0;
list($sec, $msec) = explode(' ', microtime());
$TIMER = $sec + $msec - $TIMER;
}

$t = 0;
$N = 5;

for ($i = 0; $i < $N; $i++){
timer(true);

/*
// 2,2 sec - 30 MB

$fd=fopen("file1.txt","r");
$str=fread($fd,filesize("file1.txt"));
fclose($fd);
$str=preg_replace("/\d/","",$str);
$fd=fopen("file2.txt","w");
fwrite($fd,$str);
fclose($fd);
*/


/*
// 1,1 sec - 40 MB

$arr = array(0,1,2,3,4,5,6,7,8,9);
$fd=fopen("file1.txt","r");
$str=fread($fd,filesize("file1.txt"));
fclose($fd);
$str=str_replace($arr,'',$str);
$fd=fopen("file2.txt","w");
fwrite($fd,$str);
fclose($fd);
*/


/*
// 0,93 sec - 2200 KB

$arr = array(0,1,2,3,4,5,6,7,8,9);
$fd=fopen("file1.txt","r");
$fd2=fopen("file2.txt","w");
while($str=fread($fd,450000)){
$str=str_replace($arr,'',$str);
fwrite($fd2,$str);
}
fclose($fd);
fclose($fd2);
*/


/*
// 0,93 sec - 88 KB

$arr = array(0,1,2,3,4,5,6,7,8,9);
$fd=fopen("file1.txt","r");
$fd2=fopen("file2.txt","w");
while($str=fread($fd,8000)){
$str=str_replace($arr,'',$str);
fwrite($fd2,$str);
}
fclose($fd);
fclose($fd2);
*/

timer();
$t += $TIMER;
}

echo $t / $N;
?>
 

Altex

Новичок
Пробывал очень разные варианты, самые интересные запостил.

.des.
"принципиальных" улудшений конечно нет, но в остальном ... ... ... и так видно.

преждевременная оптимизация есть зло
Смотря что и как оптимизировать. По опыту знаю, что желательно оптимизировать всё, что оптимизируется в соответствие (и не противоречии) со здравым_смыслом / удобством_дальнейшего_девелопмента. С обратным эффектом не встречался.
 

Altex

Новичок
Зато переделывал несколько раз то, что думал "и так сойдет" в плане быстродействия. Хотя согласен, здесь речь совсем не о подобных вещах, здесь всё гораздо проще и спокойнее.
 

nagash

Guest
а чем последние два варианта отличаются?
тем, что самый последний - уже был в кеше и на порядок быстрее отработался? =)
 

Altex

Новичок
а ты проверь, а потом говори.

Скорость от размера растет очень нелинейно, но и не хаотически, при 8000 и при 450000 скорость примерно одинаковая, но разница в памяти очень существенная, да и стабильность результатов у 8000 на порядок выше оказалась.

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

Кстати при других значениях этого числа за раз читаемых байт, скорость колебалась в пределах от 1,0 до 1,6 примерно. Я постепенно увеличивал/уменьшал это число и искал оптимальные решения.

nagash
Я что-то не понял, или твоя мысль была гораздо глубже?
 

Фанат

oncle terrible
Команда форума
всем любителям пооптимизировать работу с бегамайтными файлами на РНР, я настоятельно рекомендую обратитьс к документации на утилиты awk и sed

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

sergadm

Новичок
Altex
да тебе явно время девать некуда
я у верен в 95% случаев(когда требуется то что просили) файл будет текстовый и размер меньше 500кб
 

Alexandre

PHPПенсионер
вместо того, чтобы кряхтя и портя воздух громоздить трехспальный шкаф на запорожец, можно заказать газель
Фанат на газель не у всех деньги найдутся - и вообще эта реплика не в тему, хочешь похахмить - найди другой форум
 

Altex

Новичок
Мда, на редкость шутка у Фаната не удалась.

Думаю такие большие файлы обрабатывать не придется на РНР. Дальше можно и не продолжать.

sergadm
да тебе явно время девать некуда
Неа, бессоница малость была

-
Вывод, который я и хотел получить, что работая с небоьшими кусочками файла работать будет быстрее и памяти будет тратится меньше. Что и хотел показать.
 

Фанат

oncle terrible
Команда форума
Altex, никто не умаляет ценности проделанной тобой работы.
Все правильно ты говоришь - кусками обрабатывать правильнее, чем целиком.

А специализированными внешними программами - ЕЩЕ правильнее.
тебе следует все-таки преодолеть косность мышления и попытаться более реально посмотреть на то, что я напиал.
Надеюсь, у тебя получится.

Уже многие на этом форуме поняли, что внешний имэджик в сто раз удобнее и быстрее встроенной ГД.
Аналогию можешь провести сам.

Если ты думаешь ,что я тебя хотел обидеть или оскорбить - ты ошибаешься. Я всегда это делаю открыто, как в скором времени, похоже, придется в отношении нашего недалекого друга Alexandre.
Но своим постом я всего лишь хотел открыть людям новые возможности.
Естественно, инерция мышления очень велика и весьма немногие ее могут преодолеть, особенно когда ты проделал большую работу, а тебе говорят, что есть способ сделать проще и быстрее ;-).
 

Altex

Новичок
Да нет, преувеличивать не надо. Радота не дольшая. Мне просто хотелось докапаться до истины (в данном контексте). Вобщем спасибо, просто на самом деле я не задумывался о том, чтобы делать такую элементарную на первый взгляд задачку на С, и запускать из скрипта. Даже это скорее не удобно.. но вот если действительно вопрос встанет о быстродействии, то всё что ты сказал будет безапеляционно.
 

Фанат

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

Altex

Новичок
Ну тогда вдвойне спасибо, я впервые о них услышал (да простят меня профи).
 
Сверху