ошибка Out of memory при повторном использовании file()

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

tirrex

Гуру форума
Регистрация
9 Ноя 2008
Сообщения
213
Реакции
62
скрипт импортирует данные из текстовых файлов большого размера (250мб), и с одним файлом работает нормально, но при попытке сделать цикл и обработать в нем все файлы сразу после обработки 1-го файла - при открытии 2-го выдает сообщение:

Fatal error: Out of memory (allocated 262144) (tried to allocate 250339328 bytes) in X:\home\imp.net\www\converter\convert.php on line 80

код:

Код:
for ($j=1;$j<=$numparts;$j++)
		{
    		        
		
		$CSV = "part.00".$j;
		echo $CSV;
		$openit = file($CSV);
    	$counter = count($openit);
    		
    	$filearray = file("$CSV");
		
		
    		
		for($i=0; $i<$counter; $i++)
		
		{
		
		    $item = explode("$seperator", $filearray[$i]); 
		    
			
		    include("query.inc");
    		    $result = mysql_query($query);
    		    
    		    if ($result)	
    		    {
       		    	echo $effected_item." <font color=blue>добавлено</font><br>\n";
    		    }
    		    else
    		    {
       		    	echo $effected_item." <font color=red>не добавлено</font><br>\n";
    		    }
		    
    	}   
		

    	}

команда, вызывающая ошибку: $openit = file($CSV);

как сделать обработку всех файлов одним циклом, в чем может быть проблема?
 
file непригодна для больших файлов, поэтому используй fopen + fgets

в твоем случае это будет примерно так:

PHP:
for ($j=1; $j<=$numparts; $j++) {
	$CSV = 'part.00'.$j;
	echo $CSV;
	$openit = fopen($CSV, 'r');
	while(!feof($openit)) {
		$line = fgets($file);
		$item = explode($seperator, $line); 
		include("query.inc");
		$result = mysql_query($query);
		if ($result) {
			echo $effected_item." <font color=blue>добавлено</font><br>\n";
		} else {
			echo $effected_item." <font color=red>не добавлено</font><br>\n";
		}
				
	}
}
 
fgets очень тормозная фукнция, если пыха 5-ая лучше юзать get_stream_line вот пример из коментов в пышном хелпе которые показывает разницу в скорости

PHP:
<?php
// reads 10,000 lines in 27 seconds
while (!feof($handle)) {
   $line = fgets($handle, 1000000); 
}
?>

<?php
// reads 10,000 lines in 0.5 seconds
while (!feof($handle)) {
   $line = stream_get_line($handle, 1000000, "\n");
}
?>
10 тысяч строк читало 27 секунд при юазенье фгетс
10 тысяч строк читало 0.5 секунды при юзанье stream_get_line
 
Можно ещё попробовать принудительно очищать все переменные через unset в конце каждой итерации - может быть, поможет.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху