С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 30/11/11 в 16:18 |
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!" );
}
} |
Кто быстрее?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 30/11/11 в 16:23 |
Lexikon писал: | Посоветуйте что почитать для развития знаний |
Говна тебе сейчас насоветуют.
Поставь кохану - читай код.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 30/11/11 в 16:27 |
у меня наверно что то не подключено ибо
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
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 30/11/11 в 16:34 |
В переменной $path содержится путь до папки, в которой лежат необходимые файлы.
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/11/11 в 19:33 |
Цитата: | Код работал 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 писал: | Кто быстрее? |
Ну ты бы все варианты прогнал, чтобы сравнить. Или мы тут меряемся конфигами?
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/11/11 в 19:43 |
Lexikon писал: | Посоветуйте что почитать для развития знаний |
PHP 5 в подлиннике - Котеров Д.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/11/11 в 19:48 |
ох ебать, ну вы нашли где письки оголять
в случае задачи у ТС пох на скорость и расход памяти, главное чтоб было максимально понятно, потому что он изучает рнр
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 30/11/11 в 19:49 |
samedi писал: | Ну ты бы все варианты прогнал, чтобы сравнить. Или мы тут меряемся конфигами? |
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/11/11 в 20:03 |
Yacc писал: | |
а что за бенч?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 30/11/11 в 20:06 |
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/11/11 в 20:36 |
Не ожидал, что 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);
}
} |
Ну и как бы это, простоту и читаемость тоже учитываем.
|
|
|
|
С нами с 31.05.10
Сообщения: 1991
Рейтинг: 487
|
Добавлено: 30/11/11 в 20:44 |
мля пхп-шное дрочерство какое-то по 0.002 секунды выжимать....
тогда и мои 5 капель задротства. foreach - самый медленный из циклов. писалось неоднократно. меняйте. перемеривайте свои писькомерки
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 30/11/11 в 21:54 |
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 );
}
} |
Нормально мы тс-у код оптимизировали.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/11/11 в 22:07 |
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/11/11 в 22:20 |
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 писал: | Нормально мы тс-у код оптимизировали. |
Продолжать смысла нет, так как каждый запуск - другие результаты.
ТС, ну ты понял, да?
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 30/11/11 в 22:32 |
да, спасибо.
вобще походу вариантов может быть дохренище, сидя по этому топику, это как почерки в оффе.
У меня тут готовится база кеев, примерно миллион строк с ключевиками различной длины. Вот тут для себя задался мыслей обработать эту базу. Убрать лишнее, поудалять повторения и т.д.
Буду обращаться если что
на данный момент понимаю что регулярки это просто прелесть и без них не обойтись в таких скриптах, ну или обойтись, но будет геморно. Но немогу до конца понять всё это дело.
Как допустим с помощью регулярок
удалить символы +-.,
или
заменить одни символы или группу символов на другие.
Вроде всё просто и в тоже время порой как то всё по разному каждый раз.
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/11/11 в 22:35 |
Lexikon писал: | Буду обращаться если что |
Конечно! Принимаем паксум, вмз, пейпал.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 30/11/11 в 22:41 |
это самый простой вариант для меня.
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 30/11/11 в 22:42 |
samedi писал: | Принимаем паксум, вмз, пейпал |
Я вмз не принимаю.
Lexikon писал: | Как допустим с помощью регулярок
удалить символы +-.,
или
заменить одни символы или группу символов на другие. |
На будущее: не выдёргивай задачи из контекста - пиши тз полностью. Чаще всего есть решение без регулярок и оно всегда будет быстрее.
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/11/11 в 22:53 |
Lexikon писал: | Как допустим с помощью регулярок
удалить символы +-.,
или
заменить одни символы или группу символов на другие. |
str_replace работает значительно быстрее любых регулярных выражений.
NB. Прежде чем выдумывать и писать свою функцию, нужно посмотреть мануал, возможно такая уже есть (например, подсчет слов). Родные функции всегда будут работать быстрее, так как написаны на си и являются частью ядра php.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/11/11 в 23:02 |
с str_replace не все так просто, например для него "А" и "а" имеют различия, а для str_ireplace нет
и все таки под миллион строк лучше использовать базу данных, и делать нужные тебе выборки, например сразу со стоп словами
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 02/12/11 в 12:21 |
Есть скрипт генерации файла по шаблону. Если его запустить он переберет весь список файлов и сгенерирует их. Нужно чтоб скрипт сработал в определенное время или срабатывал через заданный промежуток времени и генерировал только один файл потом сново, подошло время и он сгенерировал следующий, как я пологаю тут должна быть совмесная работа скрипта и крон. Но как застваить генерировать не всем разом, а по одному файлу х.з.
---
Подумал о таком алгоритме:
В цикле файла указать чтоб цикл выполнялся 1 раз, создать вспомогательный файл в котором сохранять номер последней строки которая выполнялась, и затем при сработке крон запускать скрипт в котором цикл будет читать вспомогательный файл видя номер сроки и переходить к следующей.
---
Верно ли мыслю???
PS: только не нужно писать готовых решений , я знаю что для вас это просто. Мне главное самому научиться и разобраться.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 02/12/11 в 13:04 |
мыслишь верно
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 02/12/11 в 15:41 |
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 02/12/11 в 17:18 |
Если я правильно понимаю работу крона то скрипт бует срабатывать как будто нажали на 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с. незнаю много это или мало для такого скрипта.
|
|
|
|