Показать сообщение отдельно

  #7112  
Старый 19.12.2008, 04:42
ss88
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
С нами: 9185589

Репутация: 128
По умолчанию

Цитата:
Сообщение от Naydav  
Я тебе сразу ответил, что порезать файл по таблицам я могу и вручную, БЕЗ ВСЯКИХ ПРОГ
и в шестой раз
....
Вобщем, чего я наисследовал. Привожу два скрипта, 1-й создает файл забитый одинаковыми строками (чтобы было над чем работать), 2-й его последовательно читает порциами по 1Мб, если раскоментируете работу с БД, то еще и заносить в базу будет.
makefile.php
PHP код:
<?php
//через $_GET['s'] задается размер файла в Мб
    
set_time_limit(0);
    
ignore_user_abort(TRUE);
    
$floodString="1766 1 154 2005-02-01 00:00:00.000 NULL 2 10692.6800 8264.4285 *";
    
$hFile=fopen("dump.txt","w");
    if(
is_numeric($_GET['s']))
        
$size=$_GET['s']*1024*1024;
    else
        
$size=70*1024*1024;
    
$size=$size/strlen($floodString);
    for(
$i=0;$i<$size;$i++)
        
fwrite($hFile,$floodString);
    
fclose($hFile);
    echo 
"Файл успешно создан";
?>
testing.php
PHP код:
<?php
    $startTime
=time();//приблизительный замер времени начала
    //$db=mysql_connect("localhost","root","");
    //mysql_select_db("achat",$db);
    //убираем лимит по времени и аборты от пользователя
    
set_time_limit(0);
    
ignore_user_abort(TRUE);
    
$currPos=0;//текущая позиция в байтах
    
$hFile=fopen("dump.txt","rt");
    
$partSize=1048576;//одна порция = 1Мб
    
$currPos=0;//текущая позиция в байтах, считая от начала файла
    
$fileSize=filesize("dump.txt");//размер файла
    
echo "<b>Размер исходного файла:</b> ".($fileSize/1048576)."Mb<br/>";
    
//дочитыване до конца последней строки
    
while($currPos<$fileSize)
    {
//если осталось в файле меньше,чем на порцию
        
if($currPos+$partSize>$fileSize)
            
$partSize=$fileSize-$currPos;
        
//считывание порции определенного размера
        
$currentPartOfData=fread($hFile,$partSize);
        
$currPos+=$partSize
        
/* если последний символ не разделитель строк, то нужно дочитать порцию до разделителя*/
        
if($currentPartOfData{strlen($currentPartOfData)-1}!='*'
            do
            {
                
$currPos++;
                
$currentPartOfData.=$byte=fread($hFile,1);
            }
            while(
$byte!='*');
        
/*НАГРУЗКА - разбить порцию на массив*/
        
$currentPartOfData=explode("*",$currentPartOfData);
        
/*занесение значений в базу данных*/
        //foreach ($currentPartOfData as $string)
            //mysql_query("INSERT INTO gruz (str) VALUES('{$string}');",$db);
        
echo "<br/><b>Обработано: </b>".($currPos/1048576)."Mb";
    }
    
fclose($hFile);
    
//mysql_close($db);
    
echo "<br/><b>Время затраченное на операцию: </b>".(time()-$startTime)." seconds";
?>
Прошу всех, кому не лень, потестить эти вещи, благо - телодвижений для этого сильно много не нужно.
Вобщем, что получается, файл размером 120Мб обрабатывается без занесения в базу 2-3с. (комп. у меня совсем неважняцкий, а жаль, но надо будет это поправить ). Если еще и заносить эти 120Мб в базу, то обходится это уже в 76секунд. Как видишь, спор о быстродействии чтения из файла исчерпывается, теперь уже встает вопрос об оптимизации работы с базой, но это не было самоцелью.
Так что не нужно дамп бить на части, тем-более, что чтение+explod'ы даже 1Гб дампа (такого у тебя уж точно не будет) заняло всего 9секунд.
Потесть у себя на компе, это, конечно, только кусок моего быдлокода, но все же вопрос актуальный и интересный.
 
Ответить с цитированием