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

Тема в разделе "Как сделать...", создана пользователем tirrex, 18 май 2009.

Статус темы:
Закрыта.
  1. tirrex

    tirrex

    Регистр.:
    9 ноя 2008
    Сообщения:
    213
    Симпатии:
    60
    скрипт импортирует данные из текстовых файлов большого размера (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);

    как сделать обработку всех файлов одним циклом, в чем может быть проблема?
     
  2. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    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";
            }
                    
        }
    }
     
    tirrex нравится это.
  3. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    fgets очень тормозная фукнция, если пыха 5-ая лучше юзать get_stream_line вот пример из коментов в пышном хелпе которые показывает разницу в скорости

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

    <?php
    // reads 10,000 lines in 0.5 seconds
    while (!feof($handle)) {
       
    $line stream_get_line($handle1000000"\n");
    }
    ?>
    10 тысяч строк читало 27 секунд при юазенье фгетс
    10 тысяч строк читало 0.5 секунды при юзанье stream_get_line
     
    tirrex нравится это.
  4. lorien

    lorien Постоялец

    Регистр.:
    2 авг 2006
    Сообщения:
    84
    Симпатии:
    11
    Можно ещё попробовать принудительно очищать все переменные через unset в конце каждой итерации - может быть, поможет.
     
Статус темы:
Закрыта.