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
у меня на локалке генерятся кастомные галеры и сразу по шаблону создается файл для импорта в ДТР.
Чтоб сразу всё закинуть на сервер и дать ДТРу данные о вновь поступивших
Поэтому писать всё это дело в БД ненужно.
ЗЫ Это всё на локалке, и всё сразу же подчищается после отправки на сервак.
Тут конечно и не играет особой роли стоит ли закрывать или нет, но всё же я только всё познаю потихоньку и хотелось бы знать.
цитата
29/11/11 в 22:05
LeadFarmer
Yacc писал:
register_shutdown_function не подойдёт?
неа
с точки зрения правильности написания скрипта пойдет конечно, но я бы не полагался на пых, который некоторые вещи делает своим феерическим способом. хотя это уже просто мой стиль программирования - перестраховываться и проч.
Lexikon писал:
у меня на локалке генерятся кастомные галеры и сразу по шаблону создается файл для импорта в ДТР
ну я не же знал всей задачи ) но я один раз столкнулся с подобной задачей - генерация файлов по шаблону, с сохранением их списка где-то в файле. после того как все сделал и сдал заказчику - тот вспомнил что хотел там еще перелинковку сделать хитрую. вот хз как о такой "мелочи" люди забывают
и эта перелинковка мне мозг вынесла пока я в бд ее не реализовал. хотя заказчик тоже говорил что бд ему вааще нахер не нужна.
где-то на винте это эпическое творение до сих пор хранится. маленький генератор дорвеев по шаблону с небольшой базенкой в 3 ляма записей с кеями и схемой перелинковки
2
ibiz
- ну собственно выше я описал свое мнение о необходимости бд для подобных задач.
цитата
29/11/11 в 22:33
Lexikon
я вначале тоже думал о перелинковке, но даже если взять во внимание, что будет база, я х.з. какой алгоритм должен быть при перелинковки т.е. как первая страница должна ссылаться на другие, а те другие на остальные.
Самое просто е это сделать
А на В на С на А
но толку то от такой перелинковки
цитата
29/11/11 в 22:45
LeadFarmer
ну я не особо в курсе какие тенденции перелинковки сейчас в моде
но по логике - ссылки с морды на все страницы малоэффективны.
ну я бы на твоем месте если о перелинковке думал - взял за основу блоговую структуру перелинковки. условные морда, промежуточные страницы, посты, в них similar posts.раз такое гугель хавает на ура - почему бы так и не делать. ну разве что переложить на твою почву.
ну или черкни ПМ я тебе скину линки интересные на ресурсы одного местного авм-а. у него реально аххулиард такого говноконтента проиндексирован по нч.
цитата
30/11/11 в 08:48
Lexikon
Подскажите еще такой момент.
Я так понял в ПХП нет функции подсчета слов в тексте. По крайней мере я такое не нашел. Стал думать как выйти из ситуации. Можно определить количество пробелов, но пробелы могут встречаться не по 2 -3 раза подряд, тут тогда нужно обработать текст регулярныым выражением и убрать все повторяющиеся подряд пробелы, а также удалить пробелы в начале и конце. и потом уже считать. Также опять скорее всего с помощью регулярок запретить подсчет одиночных символов ! : . , и т.д. которые тоже могут стоять между пробелами.
Подскажите куда копать.
цитата
30/11/11 в 08:51
Austerlitz
Сделай preg_match_all и ищи все что может быть словом
цитата
30/11/11 в 09:01
ibiz
Lexikon писал:
Подскажите еще такой момент.
Я так понял в ПХП нет функции подсчета слов в тексте. По крайней мере я такое не нашел.
а это не оно случайно?
http://php.net/manual/en/function.str-word-count.php
цитата
30/11/11 в 09:14
Lexikon
ibiz писал:
а это не оно случайно?
http://php.net/manual/en/function.str-word-count.php
то что нужно!!! Как я ее недоглядел
Громадное СПАСИБО!
цитата
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) но ошибку выдало, значит неверный синтоксис.
цитата
30/11/11 в 11:56
ibiz
сделай 2 условия в одном $n_word =3 или =4
Код:
elseif ($n_word == 3 || $n_word == 4)
цитата
30/11/11 в 12:18
Yacc
Cthulhu way.
Код:
$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.
Ещё один хороший пример максимально неэффективого, нелепого и непонятного кода. А потом удивляются, почему PHP-программистов называют быдлокодерами.
цитата
30/11/11 в 12:34
Yacc
samedi писал:
Правильный вариант решения твоей задачи будет таким.
...
Ещё один хороший пример максимально неэффективого, нелепого и непонятного кода. А потом удивляются, почему PHP-программистов называют быдлокодерами.
А когда файлов будет не 4, а 400? Тоже будешь все сразу открывать?
Иногда надо
просто
решать задачу, а не выёбываться.
цитата
30/11/11 в 12:47
samedi
Yacc писал:
А когда файлов будет не 4, а 400? Тоже будешь все сразу открывать?
Иногда надо
просто
решать задачу, а не выёбываться.
Это я выёбываюсь?
Редко пишу в подобных топиках, так как потом приходиться объяснять всю нелепость чужого кода, а автор так и останется при своём, кидая во всех говном.
Учи матчасть и еще раз внимательно прочитай ТЗ автора. Открывать и закрывать тысячи раз 3 (три) файла - это полный маразм.
Приведенное мной решение максимально простое, быстрое, эффективное и работает с любым размером исходного файла. Единственное ограничение - разумная длина строк.
Последний раз редактировалось: samedi (
30/11/11 в 13:11
), всего редактировалось 2 раз(а)
цитата
30/11/11 в 12:56
Yacc
samedi писал:
Учи матчасть и еще раз внимательно прочитай ТЗ автора.
Вот только не надо умничать, я тебя прошу.
Про fclose он вчера спрашивал, вчера ему и ответили. А сегодня вопрос был как написать условие, а не сайт газпрому.
цитата
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 писал:
Вот только не надо умничать, я тебя прошу.
Про fclose он вчера спрашивал, вчера ему и ответили. А сегодня вопрос был как написать условие, а не сайт газпрому.
То есть, хочешь сказать, что когда писал свой код, не видел его кода? Может быть, если тебе нечего сказать и возразить, лучше промолчать, а не "выёбываться"?
цитата
30/11/11 в 13:20
Yacc
samedi писал:
Учитывая следующую строку в твоем коде
Да это не мой код, а ТС-а. Я, отвечая на его вопрос, по-сути, одну строку туда добавил, показывая возможности нестрогой типизации.
Твой код конечно лучше. Не лучший, а лучше, чем у ТС-а
.
цитата
30/11/11 в 13:50
samedi
Yacc писал:
Твой код конечно лучше. Не лучший, а лучше, чем у ТС-а
.
Очень хочу посмотреть на лучшее решения от тебя. Нет, правда. Мне кажется, что упростить и ускорить больше нечего, ну разве что в последнем варианте можно читать исходный файл построчно.
Очень расстроюсь, если лучшего кода от тебя не увижу. Хотя уверен в этом.
цитата
30/11/11 в 15:02
Lexikon
вобще всем спасибо и ненужно тут ругаться.
т.к. я пока еще учусь я буду рассматривать и раскладывать для себя все возможные варианты.
Так что всем СПАСИБО!!!
PS ради интереса глянул сколько весит text.dat
в нем 10240 строк
и весит он 201кб
---
вот стата по моему коду
Код работал 97.00127196312с.
---
Yacc
Код работал 95.450877904892с.
samedi
Код работал 0.42947101593018с. - первый код (попробовал его погонять несколько раз, самый лучший результат был 0,15.....)
Код работал 2.2578520774841с. - второй код
---
я так предполочил что тут всё зависит от выбранного цикла, получается for делает много лишних телодвижений, хотя может я и не прав.
Нужно будет мне разобраться когда и какой цикл разумней применять в работе того или иного скрипта
for , while или do...while
---
Посоветуйте что почитать для развития знаний
Стр.
1
,
2
,
3
>
последняя »
Новая тема
Ответить
Эта страница в полной версии