Сообщение от
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секунд.
Потесть у себя на компе, это, конечно, только кусок моего быдлокода, но все же вопрос актуальный и интересный.