Обработка файлов на денвере

Статус
В этой теме нельзя размещать новые ответы.

rock2

Писатель
Регистрация
5 Окт 2010
Сообщения
6
Реакции
0
Не могу понять, почему при обработке текстовых файлов денвер отказывается обрабатывать больше 30 метров. Те есть файл размером 100мб, обрабатываю его скриптом (любым) где он пересохраняется в другой файл, и он не превышает 30 метров вместо ожидаемых 100. В php.ini максимальный размер памяти 2гига и время 100000 сек. В чем причина такого поведения?
 
Код в студию.
Все зависит от скрипта.
Память очень легко сожрать на сервере
PHP:
<?php
/// file.txt - 100 метров
$A=file_get_contnts('file.txt'); /// 100 метров оперативки используется
$A=$b; /// 200 метров используется
$A=$c; /// 300 метров используется
$A=$d; /// 400 метров используется
?>
 
А как можно очистить оперативку во время выполнения скрипта?
Например
PHP:
$A=file_get_contnts('file.txt'); /// 100 метров оперативки используется
$A=$b;
//дальше $A уже не нужен, очищаем буффер

только вот ошибок переполнения памяти почемуто не выводится, те скрипты даже не останавливаютя, но пишут не более 30мб
 
только вот ошибок переполнения памяти почемуто не выводится, те скрипты даже не останавливаютя, но пишут не более 30мб

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

А как можно очистить оперативку во время выполнения скрипта?
До версии 5.3 точно никак.
в версии 5.3 вроде есть функции для высвобождения циклических ссылок. может и для остального также есть
 
PHP:
$text = file_get_contents("d:\txt\1.txt");

$replace = array(

"--" => "",
"---" => ""

);
$text = strip_tags($text);

$text = strtr($text, $replace);

$text = preg_replace("#[\.]{2,5}#isU", ".", $text);

$text = preg_replace("#[ ]{2,5}#isU", " ", $text);

$text_exp = explode(".", $text);
  
  foreach ($text_exp as $value=>$index)
     {


	 if (strlen($index)>30)
      {
   
	  $index = ucfirst(trim($index)).".";

	  $handle = fopen("d:\txt\2.txt", "a+");
	  fwrite($handle, $index);
	  fclose($handle);
      }
     }

error_reporting = E_ALL & E_NOTICE & E_STRICT - ошибок не выдает
 
PHP:
$text = file_get_contents("d:\txt\1.txt");
$replace = array(
"--" => "",
"---" => ""
);
$text = strip_tags($text);
$text = strtr($text, $replace);
$text = preg_replace("#[\.]{2,5}#isU", ".", $text);
$text = preg_replace("#[ ]{2,5}#isU", " ", $text);
$text_exp = explode(".", $text);
  foreach ($text_exp as $value=>$index)
     {
	 if (strlen($index)>30)
      {
	  $index = ucfirst(trim($index)).".";
	  $handle = fopen("d:\txt\2.txt", "a+");
	  fwrite($handle, $index);
	  fclose($handle);
      }
     }
error_reporting = E_ALL & E_NOTICE & E_STRICT - ошибок не выдает
Первая идея - после
PHP:
$text = file_get_contents("d:\txt\1.txt");
сделать
PHP:
echo strlen($text);
чтобы посмотреть какой размер у этой переменной.
Ваша главная ошибка - php не предназначен для работы с такими большими строками и массивами, скорость работы падает на несколько порядков. Правильное решение - открывать файл по частям (fopen - потом в цикле fgets), в каждой части делать разбивку на строки (или какие-то другие завершенные фрагменты) и обрабатывать их по отдельности.
 
Те есть файл размером 100мб, обрабатываю его скриптом (любым) где он пересохраняется в другой файл, и он не превышает 30 метров в

На моем денвере все пучком. исходный файл 1.txt - 90 Мб, конечные файлы 2.txt и 3.txt - такие же.
Скрипт:
PHP:
<?
$file_in = fopen ("1.txt","r");
$file_out = fopen ("2.txt","w");

while (!feof($file_in)) {
   $i = fgets ($file_in);
	fputs ($file_out,$i);
}
fclose ($file_in);
fclose ($file_out);
//все что выще работает корректно
//все что ниже тоже

$file_test_out =  fopen ("3.txt","w");

$text = file_get_contents ("1.txt");
fputs ($file_test_out,$text);
?>
Как видно из первой части скрипта, размер переменной $i всегда маленький.
Во второй части скрипта переменная
$text равна 90 Мб и тже все норм. работает

P.S. На всякий случай мой php.ini (Денвер базовый + доп модули)
 

Вложения

  • php.zip
    15,9 KB · Просмотры: 3
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху