Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Подскажите как правильно
Новая тема
Ответить
цитата
30/11/11 в 16:18
Yacc
Lexikon писал:
ненужно тут ругаться.
Да никто не ругается, милые бранятся - только тешатся.
Lexikon писал:
Код работал 97.00127196312с.
97 секунд? Да, ты охуел.
Элементарная оптимизация и это время сокращается почти в 1000 раз.
txt.dat - 101Кб, 10240 строк, 0-5 слов
sex
в строчке.
Код:
public function bench_yacc() {
$path = APPPATH.'test\\yacc\\';
$file = $path.'txt.dat';
$ch = array( 'vch.txt', 'sch.txt', 'nch.txt' );
$r = array( '', '', '' );
$file_array = file( $file );
$fl = count( $file_array );
$rl = count( $ch );
if( is_array( $file_array ) AND $fl > 0 ) {
for( $i = 0; $i < $fl; $i++ ) {
$n_word = str_word_count( $file_array[ $i ] );
$j = ( $n_word == 3 OR $n_word == 4 ) + 2 * ( $n_word > 4 );
$r[ $j ] .= $file_array[ $i ];
}
for( $i = 0; $i < $rl; $i += 1) {
file_put_contents( $path.$ch[ $i ], $r[ $i ] );
}
}
else {
echo( "Error Opening The File!" );
}
}
Кто быстрее?
цитата
30/11/11 в 16:23
Yacc
Lexikon писал:
Посоветуйте что почитать для развития знаний
Говна тебе сейчас насоветуют.
Поставь кохану - читай код.
цитата
30/11/11 в 16:27
Lexikon
у меня наверно что то не подключено ибо
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0
Warning: Unknown: Failed opening 'H:\www\_test\28\mx_script\script.php' for inclusion (include_path='.;C:\php5\pear') in Unknown on line 0
цитата
30/11/11 в 16:34
Yacc
В переменной $path содержится путь до папки, в которой лежат необходимые файлы.
цитата
30/11/11 в 19:33
samedi
Цитата:
Код работал 2.2578520774841с. - второй код
Предсказуемо, так как создавался отдельный файл для каждого количества слов. Алгоритм по сути тот же, что и у последнего варианта Yacc. Только качество кода у него страдает и расход памяти двукратный.
Должно быть как-то так.
Код:
<?php
$filenames = array('vch.txt', 'sch.txt', 'nch.txt');
$string_list = file('txt.dat', FILE_SKIP_EMPTY_LINES);
$content = array_fill_keys($filenames, '');
while ($string = array_shift($string_list)) {
$word_count = str_word_count($string);
if ($word_count <= 2) {
$content['vch.txt'] .= $string;
} else if ($word_count == 3 || $word_count == 4) {
$content['sch.txt'] .= $string;
} else {
$content['nch.txt'] .= $string;
}
}
foreach ($content as $filename => $content_string) {
file_put_contents($filename, $content_string);
}
Но самый правильный вариант - мой первый, т.к. может работать с файлами любых размеров.
Yacc писал:
Кто быстрее?
Ну ты бы все варианты прогнал, чтобы сравнить. Или мы тут меряемся конфигами?
цитата
30/11/11 в 19:43
samedi
Lexikon писал:
Посоветуйте что почитать для развития знаний
PHP 5 в подлиннике - Котеров Д.
цитата
30/11/11 в 19:48
ibiz
ох ебать, ну вы нашли где письки оголять
в случае задачи у ТС пох на скорость и расход памяти, главное чтоб было максимально понятно, потому что он изучает рнр
цитата
30/11/11 в 19:49
Yacc
samedi писал:
Ну ты бы все варианты прогнал, чтобы сравнить. Или мы тут меряемся конфигами?
цитата
30/11/11 в 20:03
ibiz
Yacc писал:
а что за бенч?
цитата
30/11/11 в 20:06
Yacc
http://kohanaframework.org/3.0/guide/api/Codebench
цитата
30/11/11 в 20:36
samedi
Не ожидал, что array_shift работает так медленно. Подправил.
yacc_1 0.153630018234 sec
yacc_2 0.0126509666443 sec
samedi_1 0.0351898670197 sec
samedi_2 0.0109429359436 sec
Мой вариант стабильно на 0.002 быстрее.
Полный код теста прикладываю.
<?php
$words = array('first', 'second', 'third', 'fourth', 'fifth');
$string_list = array();
for ($i = 1; $i < 10240; $i++) {
shuffle($words);
$string = implode(' ', $words);
$string_list[] = $string;
}
file_put_contents('dat.txt', implode("\n", $string_list));
timer('yacc_1');
timer('yacc_2');
timer('samedi_1');
timer('samedi_2');
function timer($function) {
clean();
$time_start = microtime(true);
call_user_func($function);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "$function $time sec <br>";
}
function clean() {
@unlink('vch.txt');
@unlink('sch.txt');
@unlink('nch.txt');
}
function yacc_1() {
$file = "dat.txt";
$ch = array(
"vch.txt",
"sch.txt",
"nch.txt"
);
$file_array = file( $file );
$l = count( $file_array );
if( is_array( $file_array ) AND $l > 0 ) {
for( $i = 0; $i < $l; $i++ ) {
$n_word = str_word_count( $file_array[ $i ] );
$j = ( $n_word == 3 OR $n_word == 4 ) + 2 * ( $n_word > 4 );
$f = fopen( $ch[ $j ], "a" );
fwrite( $f, $file_array[ $i ] );
fclose( $f );
}
}
else {
echo( "Error Opening The File!" );
}
}
function samedi_1() {
$dat_handle = fopen("dat.txt", "r") or die("can't open file txt.dat");
$vch_handle = fopen("vch.txt", "a") or die("can't open file vch.txt");
$sch_handle = fopen("sch.txt", "a") or die("can't open file sch.txt");
$nch_handle = fopen("nch.txt", "a") or die("can't open file nch.txt");
while (($dat_str = fgets($dat_handle)) !== false) {
$word_count = str_word_count($dat_str);
if ($word_count <= 2) {
fwrite($vch_handle, $dat_str);
} else if ($word_count == 3 || $word_count == 4) {
fwrite($sch_handle, $dat_str);
} else {
fwrite($nch_handle, $dat_str);
}
}
fclose($dat_handle);
fclose($vch_handle);
fclose($sch_handle);
fclose($nch_handle);
}
function yacc_2() {
$path = './';
$file = $path.'dat.txt';
$ch = array( 'vch.txt', 'sch.txt', 'nch.txt' );
$r = array( '', '', '' );
$file_array = file( $file );
$fl = count( $file_array );
$rl = count( $ch );
if( is_array( $file_array ) AND $fl > 0 ) {
for( $i = 0; $i < $fl; $i++ ) {
$n_word = str_word_count( $file_array[ $i ] );
$j = ( $n_word == 3 OR $n_word == 4 ) + 2 * ( $n_word > 4 );
$r[ $j ] .= $file_array[ $i ];
}
for( $i = 0; $i < $rl; $i += 1) {
file_put_contents( $path.$ch[ $i ], $r[ $i ] );
}
}
else {
echo( "Error Opening The File!" );
}
}
function samedi_2() {
$filenames = array('vch.txt', 'sch.txt', 'nch.txt');
$string_list = file('dat.txt', FILE_SKIP_EMPTY_LINES);
$content = array_fill_keys($filenames, '');
foreach ($string_list as $string) {
$word_count = str_word_count($string);
if ($word_count <= 2) {
$content['vch.txt'] .= $string;
} else if ($word_count == 3 || $word_count == 4) {
$content['sch.txt'] .= $string;
} else {
$content['nch.txt'] .= $string;
}
}
foreach ($content as $filename => $content_string) {
file_put_contents($filename, $content_string);
}
}
Ну и как бы это, простоту и читаемость тоже учитываем.
цитата
30/11/11 в 20:44
LeadFarmer
мля пхп-шное дрочерство какое-то
по 0.002 секунды выжимать....
тогда и мои 5 капель задротства. foreach - самый медленный из циклов. писалось неоднократно. меняйте. перемеривайте свои писькомерки
цитата
30/11/11 в 21:54
Yacc
samedi писал:
Мой вариант стабильно на 0.002 быстрее.
Типичный (лучший для тебя) результат:
Код:
public function bench_yacc2() {
$path = APPPATH.'test\\yacc\\';
$ch = array( 'vch.txt', 'sch.txt', 'nch.txt' );
$r = array( '', '', '' );
$f = file( $path.'txt.dat' );
foreach( $f as $s ) {
$w = str_word_count( $s );
$r[ 1 - ( $w < 3 ) + ( $w > 4 ) ] .= $s;
}
$i = 0;
foreach( $r as $s ) {
file_put_contents( $path.$ch[ $i++ ], $s );
}
}
Нормально мы тс-у код оптимизировали.
цитата
30/11/11 в 22:07
ibiz
samedi писал:
Не ожидал, что array_shift работает так медленно. Подправил.
Мой вариант стабильно на 0.002 быстрее.
Код:
<?php
function samedi_2() {
$filenames = array('vch.txt', 'sch.txt', 'nch.txt');
$string_list = file('dat.txt', FILE_SKIP_EMPTY_LINES);
$content = array_fill_keys($filenames, '');
foreach ($string_list as $string) {
$word_count = str_word_count($string);
if ($word_count <= 2) {
$content['vch.txt'] .= $string;
} else if ($word_count == 3 || $word_count == 4) {
$content['sch.txt'] .= $string;
} else {
$content['nch.txt'] .= $string;
}
}
foreach ($content as $filename => $content_string) {
file_put_contents($filename, $content_string);
}
}
Ну и как бы это, простоту и читаемость тоже учитываем.
можно выиграть еще пару сотых миллисек на больших объемах, если сделать условие таким образом
Код:
if ($word_count <= 2) {
$content['vch.txt'] .= $string;
} else if ($word_count > 4) {
$content['nch.txt'] .= $string;
} else {
$content['sch.txt'] .= $string;
}
цитата
30/11/11 в 22:20
samedi
1000 прогонов каждой функции
yacc_3 11.9272489548 sec
samedi_3 11.7874038219 sec
ibiz_1 11.8154919147 sec
Код:
function samedi_3() {
$string_list = file('dat.txt');
$content = array('vch.txt' => '', 'sch.txt' => '', 'nch.txt' => '');
foreach ($string_list as $string) {
$word_count = str_word_count($string);
if ($word_count > 4) {
$content['nch.txt'] .= $string;
} else if ($word_count > 2) {
$content['sch.txt'] .= $string;
} else {
$content['vch.txt'] .= $string;
}
}
foreach ($content as $filename => $content_string) {
file_put_contents($filename, $content_string);
}
}
Yacc писал:
Нормально мы тс-у код оптимизировали.
Продолжать смысла нет, так как каждый запуск - другие результаты.
ТС, ну ты понял, да?
цитата
30/11/11 в 22:32
Lexikon
да, спасибо.
вобще походу вариантов может быть дохренище, сидя по этому топику, это как почерки в оффе.
У меня тут готовится база кеев, примерно миллион строк с ключевиками различной длины. Вот тут для себя задался мыслей обработать эту базу. Убрать лишнее, поудалять повторения и т.д.
Буду обращаться если что
на данный момент понимаю что регулярки это просто прелесть и без них не обойтись в таких скриптах, ну или обойтись, но будет геморно. Но немогу до конца понять всё это дело.
Как допустим с помощью регулярок
удалить символы +-.,
или
заменить одни символы или группу символов на другие.
Вроде всё просто и в тоже время порой как то всё по разному каждый раз.
цитата
30/11/11 в 22:35
samedi
Lexikon писал:
Буду обращаться если что
Конечно! Принимаем паксум, вмз, пейпал.
цитата
30/11/11 в 22:41
Lexikon
это самый простой вариант для меня.
цитата
30/11/11 в 22:42
Yacc
samedi писал:
Принимаем паксум, вмз, пейпал
Я вмз не принимаю.
Lexikon писал:
Как допустим с помощью регулярок
удалить символы +-.,
или
заменить одни символы или группу символов на другие.
На будущее: не выдёргивай задачи из контекста - пиши тз полностью. Чаще всего есть решение без регулярок и оно всегда будет быстрее.
цитата
30/11/11 в 22:53
samedi
Lexikon писал:
Как допустим с помощью регулярок
удалить символы +-.,
или
заменить одни символы или группу символов на другие.
str_replace работает
значительно
быстрее любых регулярных выражений.
NB. Прежде чем выдумывать и писать свою функцию, нужно посмотреть мануал, возможно такая уже есть (например, подсчет слов). Родные функции всегда будут работать быстрее, так как написаны на си и являются частью ядра php.
цитата
30/11/11 в 23:02
ibiz
с str_replace не все так просто, например для него "А" и "а" имеют различия, а для str_ireplace нет
и все таки под миллион строк лучше использовать базу данных, и делать нужные тебе выборки, например сразу со стоп словами
цитата
02/12/11 в 12:21
Lexikon
Есть скрипт генерации файла по шаблону. Если его запустить он переберет весь список файлов и сгенерирует их. Нужно чтоб скрипт сработал в определенное время или срабатывал через заданный промежуток времени и генерировал только один файл потом сново, подошло время и он сгенерировал следующий, как я пологаю тут должна быть совмесная работа скрипта и крон. Но как застваить генерировать не всем разом, а по одному файлу х.з.
---
Подумал о таком алгоритме:
В цикле файла указать чтоб цикл выполнялся 1 раз, создать вспомогательный файл в котором сохранять номер последней строки которая выполнялась, и затем при сработке крон запускать скрипт в котором цикл будет читать вспомогательный файл видя номер сроки и переходить к следующей.
---
Верно ли мыслю???
PS: только не нужно писать готовых решений
, я знаю что для вас это просто. Мне главное самому научиться и разобраться.
цитата
02/12/11 в 13:04
ibiz
мыслишь верно
цитата
02/12/11 в 15:41
ibiz
samedi писал:
1000 прогонов каждой функции
yacc_3 11.9272489548 sec
samedi_3 11.7874038219 sec
ibiz_1 11.8154919147 sec
Код:
function samedi_3() {
$string_list = file('dat.txt');
$content = array('vch.txt' => '', 'sch.txt' => '', 'nch.txt' => '');
foreach ($string_list as $string) {
$word_count = str_word_count($string);
if ($word_count > 4) {
$content['nch.txt'] .= $string;
} else if ($word_count > 2) {
$content['sch.txt'] .= $string;
} else {
$content['vch.txt'] .= $string;
}
}
foreach ($content as $filename => $content_string) {
file_put_contents($filename, $content_string);
}
}
Продолжать смысла нет, так как каждый запуск - другие результаты.
ТС, ну ты понял, да?
еще можно получить пару сотых миллисекунд, если - file_put_contents работает медленнее чем fopen,fwrite
цитата
02/12/11 в 17:18
Lexikon
Если я правильно понимаю работу крона то скрипт бует срабатывать как будто нажали на F5.
Вот что у меня получилось. это не готовый скрипт, но рабочий тут та часть которая отвечает за чтение по строкам при каждом новом обращении.
Незнаю на сколько верно это решение, но работает.
Вставал вопрос:
- Нужно ли проверять наполненость файла line_n.dat, вдруг он создался но пустой.
- Как правильно закончить работу скрипта когда он сгенерировал все файлы, я вставил exit(); х.з. на сколько это верно.
- Также думал стоит ли с помощью регулярок убирать возможные символы кроме цифр (хотя откуда им там взяться) и думал стоит ли удалять пробелы в начале и конце, но всеже решил это сделать.
<?php
$line_n = "line_n.dat";
$text = "text.dat";
if(file_exists($line_n))
{
$n = file_get_contents($line_n);
$n = trim(preg_replace('/[^0-9,]/', '', $n));
$text = file($text);
$count = count($text);
if ($n <= $count-1)
{
echo $text[$n];
$line_n = fopen($line_n, "w");
fputs($line_n, $n+1);
fclose($line_n);
}
else
{
exit();
}
}
else {
$line_n = fopen($line_n, "w");
fputs($line_n, "0");
fclose($line_n);
}
?>
Это содержание файла text.dat
stroka 0
stroka 1
stroka 2
stroka 3
stroka 4
stroka 5
stroka 6
stroka 7
stroka 8
stroka 9
stroka 10
stroka 11
stroka 12
stroka 13
stroka 14
stroka 15
stroka 16
stroka 17
stroka 18
stroka 19
stroka 20
По тесту код работал примерно 0.0279381275177с. незнаю много это или мало для такого скрипта.
Стр.
« первая
<
1
,
2
,
3
>
последняя »
Новая тема
Ответить
Эта страница в полной версии