Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Подскажите как правильно
цитата
29/11/11 в 19:45
 Lexikon
У меня запущен цикл в процессе которого будет происходить запись в файл
цикл можкт идти до нескольких тысяч повторов за раз.
Стоит ли после каждой записи в файл, закрывать его
fclose($f);
???
Во время цикла генерятся файлы, и их имена как раз и записываются в отдельный файл.
цитата
29/11/11 в 20:03
 ibiz
надо, чтоб не мусорили память
цитата
29/11/11 в 20:46
 Yacc
Имхо кошерней будет собирать имена файлов в переменную и по окончании цикла один раз вызвать file_put_contents.
цитата
29/11/11 в 21:05
 LeadFarmer
вообще правильнее в бд писать конечно эти имена файлов - возни чуть больше, масштабировать проще.
но если писать список надо именно в файл (назову файл вывода - ФВ), то с одной стороны после каждой операции создания файла заново открывать фв, вносить туда изменения и закрывать не есть правильно.
с другой стороны обновлять фв после всех операций тоже чревато последствиями в виде подвисшего скрипта -> пропущенного внесения изменений. или set_time_limit(0) будет запрещен на хосте и скрипту не будет хватать времени чтобы в фв вносить данные - тоже косяк.
так что тут нужен промежуточный вариант - например копить данные для внесения в фв по 1000 строк по какому-то счетчику. потом записывать их в фв, обнулять счетчик.
повторюсь, на мой взгдял использовать текстовик для хранения 10к+ данных - неправильно.
цитата
29/11/11 в 21:18
 Yacc
LeadFarmer писал:
с другой стороны обновлять фв после всех операций тоже чревато последствиями в виде подвисшего скрипта -> пропущенного внесения изменений. или set_time_limit(0) будет запрещен на хосте и скрипту не будет хватать времени чтобы в фв вносить данные

register_shutdown_function не подойдёт?
цитата
29/11/11 в 21:18
 ibiz
LeadFarmer писал:

повторюсь, на мой взгдял использовать текстовик для хранения 10к+ данных - неправильно.


почему не правильно?
как раз сейчас пишем цмс на файлах для хранения бинарных и текстовых файлов, по 1000 файлов в каталоге на трехуровневой вложенности получается 1000*1000*1000 штук
проблема в том, что сильно возрастает нагрузка на винты...
цитата
29/11/11 в 21:19
 Lexikon
у меня на локалке генерятся кастомные галеры и сразу по шаблону создается файл для импорта в ДТР.
Чтоб сразу всё закинуть на сервер и дать ДТРу данные о вновь поступивших icon_wink.gif Поэтому писать всё это дело в БД ненужно.
ЗЫ Это всё на локалке, и всё сразу же подчищается после отправки на сервак.
Тут конечно и не играет особой роли стоит ли закрывать или нет, но всё же я только всё познаю потихоньку и хотелось бы знать.
цитата
29/11/11 в 22:05
 LeadFarmer
Yacc писал:
register_shutdown_function не подойдёт?

неа icon_smile.gif с точки зрения правильности написания скрипта пойдет конечно, но я бы не полагался на пых, который некоторые вещи делает своим феерическим способом. хотя это уже просто мой стиль программирования - перестраховываться и проч.
Lexikon писал:
у меня на локалке генерятся кастомные галеры и сразу по шаблону создается файл для импорта в ДТР

ну я не же знал всей задачи ) но я один раз столкнулся с подобной задачей - генерация файлов по шаблону, с сохранением их списка где-то в файле. после того как все сделал и сдал заказчику - тот вспомнил что хотел там еще перелинковку сделать хитрую. вот хз как о такой "мелочи" люди забывают icon_smile.gif
и эта перелинковка мне мозг вынесла пока я в бд ее не реализовал. хотя заказчик тоже говорил что бд ему вааще нахер не нужна.
где-то на винте это эпическое творение до сих пор хранится. маленький генератор дорвеев по шаблону с небольшой базенкой в 3 ляма записей с кеями и схемой перелинковки icon_smile.gif
2 ibiz - ну собственно выше я описал свое мнение о необходимости бд для подобных задач.
цитата
29/11/11 в 22:33
 Lexikon
я вначале тоже думал о перелинковке, но даже если взять во внимание, что будет база, я х.з. какой алгоритм должен быть при перелинковки т.е. как первая страница должна ссылаться на другие, а те другие на остальные.
Самое просто е это сделать
А на В на С на А
но толку то от такой перелинковки
цитата
29/11/11 в 22:45
 LeadFarmer

ну я не особо в курсе какие тенденции перелинковки сейчас в моде icon_mrgreen.gif но по логике - ссылки с морды на все страницы малоэффективны.
ну я бы на твоем месте если о перелинковке думал - взял за основу блоговую структуру перелинковки. условные морда, промежуточные страницы, посты, в них similar posts.раз такое гугель хавает на ура - почему бы так и не делать. ну разве что переложить на твою почву.

ну или черкни ПМ я тебе скину линки интересные на ресурсы одного местного авм-а. у него реально аххулиард такого говноконтента проиндексирован по нч.
цитата
30/11/11 в 08:48
 Lexikon
Подскажите еще такой момент.
Я так понял в ПХП нет функции подсчета слов в тексте. По крайней мере я такое не нашел. Стал думать как выйти из ситуации. Можно определить количество пробелов, но пробелы могут встречаться не по 2 -3 раза подряд, тут тогда нужно обработать текст регулярныым выражением и убрать все повторяющиеся подряд пробелы, а также удалить пробелы в начале и конце. и потом уже считать. Также опять скорее всего с помощью регулярок запретить подсчет одиночных символов ! : . , и т.д. которые тоже могут стоять между пробелами.
Подскажите куда копать. icon_rolleyes.gif
цитата
30/11/11 в 08:51
 Austerlitz
Сделай preg_match_all и ищи все что может быть словом
цитата
30/11/11 в 09:01
 ibiz
Lexikon писал:
Подскажите еще такой момент.
Я так понял в ПХП нет функции подсчета слов в тексте. По крайней мере я такое не нашел.


а это не оно случайно? trollface.png
http://php.net/manual/en/function.str-word-count.php
цитата
30/11/11 в 09:14
 Lexikon
ibiz писал:
а это не оно случайно? trollface.png
http://php.net/manual/en/function.str-word-count.php

smail54.gif
то что нужно!!! Как я ее недоглядел icon_confused.gif
Громадное СПАСИБО!
цитата
30/11/11 в 11:09
 Lexikon

<?php


$file = "text.dat";

$vch = "vch.txt";

$sch = "sch.txt";

$nch = "nch.txt";


$file_array = file($file);

  if(!$file_array)
  {
    echo("Error Opening The File!");
  }
  else
  {

    for($i=0; $i < count($file_array); $i++)
    {
   
    $n_word = str_word_count($file_array[$i]);
     if ($n_word <= 2)
    {
      
      $f = fopen($vch, "a");
      
      fwrite($f, $file_array[$i]);
      
      fclose($f);
    }
     elseif ($n_word == 3)
    {
      
      $f = fopen($sch, "a");
      
      fwrite($f, $file_array[$i]);
      
      fclose($f);
    }
     elseif ($n_word == 4)
    {
      
      $f = fopen($sch, "a");
      
      fwrite($f, $file_array[$i]);
      
      fclose($f);
    }
     else 
    {
      
      $f = fopen($nch, "a");
      
      fwrite($f, $file_array[$i]);
      
      fclose($f);
    }
    }
  }

?>


вот только интересно как сделать одним разом вот это

     elseif ($n_word == 3)
    {
      
      $f = fopen($sch, "a");
      
      fwrite($f, $file_array[$i]);
      
      fclose($f);
    }
     elseif ($n_word == 4)
    {
      
      $f = fopen($sch, "a");
      
      fwrite($f, $file_array[$i]);
      
      fclose($f);
    }

тут нужно как то интервал указаь от не меньше или рано трем и не больше или ранов четырем. х.з. как сделать, сделал (3 => $n_word <=4) но ошибку выдало, значит неверный синтоксис. icon_confused.gif
цитата
30/11/11 в 11:56
 ibiz
сделай 2 условия в одном $n_word =3 или =4 trollface.png
Код:
elseif ($n_word == 3 || $n_word == 4)
цитата
30/11/11 в 12:18
 Yacc
Cthulhu way. icon_smile.gif

Код:
$file = "text.dat";

$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!" );
}


Последний раз редактировалось: Yacc (30/11/11 в 13:04), всего редактировалось 1 раз
цитата
30/11/11 в 12:29
 samedi
Lexikon писал:
цикл можкт идти до нескольких тысяч повторов за раз.
Стоит ли после каждой записи в файл, закрывать его


Правильный вариант решения твоей задачи будет таким.

Код:
<?php

$dat_handle = fopen("txt.dat", "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);


Цитата:
Cthulhu way. icon_smile.gif


Ещё один хороший пример максимально неэффективого, нелепого и непонятного кода. А потом удивляются, почему PHP-программистов называют быдлокодерами.
цитата
30/11/11 в 12:34
 Yacc
samedi писал:
Правильный вариант решения твоей задачи будет таким.
...
Ещё один хороший пример максимально неэффективого, нелепого и непонятного кода. А потом удивляются, почему PHP-программистов называют быдлокодерами.

А когда файлов будет не 4, а 400? Тоже будешь все сразу открывать?

Иногда надо просто решать задачу, а не выёбываться. icon_smile.gif
цитата
30/11/11 в 12:47
 samedi
Yacc писал:
А когда файлов будет не 4, а 400? Тоже будешь все сразу открывать?

Иногда надо просто решать задачу, а не выёбываться. icon_smile.gif

Это я выёбываюсь? facepalm.gif Редко пишу в подобных топиках, так как потом приходиться объяснять всю нелепость чужого кода, а автор так и останется при своём, кидая во всех говном.

Учи матчасть и еще раз внимательно прочитай ТЗ автора. Открывать и закрывать тысячи раз 3 (три) файла - это полный маразм.

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

Последний раз редактировалось: samedi (30/11/11 в 13:11), всего редактировалось 2 раз(а)
цитата
30/11/11 в 12:56
 Yacc
samedi писал:
Учи матчасть и еще раз внимательно прочитай ТЗ автора.

Вот только не надо умничать, я тебя прошу. icon_smile.gif

Про fclose он вчера спрашивал, вчера ему и ответили. А сегодня вопрос был как написать условие, а не сайт газпрому. icon_smile.gif
цитата
30/11/11 в 13:13
 samedi
Yacc писал:
А когда файлов будет не 4, а 400? Тоже будешь все сразу открывать?

Отвечу прямо на твой вопрос — нет. Учитывая следующую строку в твоем коде
Код:
$file_array = file( $file );

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

Мой вариант.

Код:
$string_list = file("txt.dat");
$count_list  = array();

while ($string = array_shift($string_list)) {
   $word_count = str_word_count($string);
   if (isset($count_list[$word_count])) {
      $count_list[$word_count][] = $string;
   } else {
      $count_list[$word_count] = array($string);
   }
}

foreach ($count_list as $count => $string_list) {
   file_put_contents("{$count}.txt", implode("\n", $string_list));
}


В этом случае расход памяти не превышает исходный файл. Работает быстро и эффективно для любого количества строк и любого количества конечных файлов. Хочешь возразить?

Yacc писал:
Вот только не надо умничать, я тебя прошу. icon_smile.gif
Про fclose он вчера спрашивал, вчера ему и ответили. А сегодня вопрос был как написать условие, а не сайт газпрому. icon_smile.gif


То есть, хочешь сказать, что когда писал свой код, не видел его кода? Может быть, если тебе нечего сказать и возразить, лучше промолчать, а не "выёбываться"?
цитата
30/11/11 в 13:20
 Yacc
samedi писал:
Учитывая следующую строку в твоем коде

Да это не мой код, а ТС-а. Я, отвечая на его вопрос, по-сути, одну строку туда добавил, показывая возможности нестрогой типизации.

Твой код конечно лучше. Не лучший, а лучше, чем у ТС-а icon_smile.gif.
цитата
30/11/11 в 13:50
 samedi
Yacc писал:
Твой код конечно лучше. Не лучший, а лучше, чем у ТС-а icon_smile.gif.

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

Очень расстроюсь, если лучшего кода от тебя не увижу. Хотя уверен в этом.
цитата
30/11/11 в 15:02
 Lexikon
вобще всем спасибо и ненужно тут ругаться.
т.к. я пока еще учусь я буду рассматривать и раскладывать для себя все возможные варианты.
Так что всем СПАСИБО!!! smail54.gif

PS ради интереса глянул сколько весит text.dat
в нем 10240 строк
и весит он 201кб
---
вот стата по моему коду
Код работал 97.00127196312с.
---
Yacc
Код работал 95.450877904892с.
samedi
Код работал 0.42947101593018с. - первый код (попробовал его погонять несколько раз, самый лучший результат был 0,15.....)
Код работал 2.2578520774841с. - второй код

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

Нужно будет мне разобраться когда и какой цикл разумней применять в работе того или иного скрипта
for , while или do...while

---
Посоветуйте что почитать для развития знаний smail54.gif
Стр. 1, 2, 3  >  последняя »


Эта страница в полной версии