Xpoint
   [напомнить пароль]

Парсинг больших файлов

Метки: [без меток]
2008-10-14 22:05:17 [обр] DekaR[досье]

Доброго времени суток!
есть код :

....
if (!(empty($filename))){
if (($fp=fopen($filename,"rb"))){
$buffer=fread($fp,filesize($filename));
fclose($fp);
unlink($filename);
$separator=";";
*$buffer=str_replace("\n".$separator,"\n0".$separator,$buffer);*
$buffer=str_replace(";;;",";"."0".";"."0".";",$buffer);
$buffer=str_replace("; ;",";"."0".";",$buffer);
$buffer=str_replace(";;",";"."0".";",$buffer);
$buffer=str_replace($separator."\n",$separator."0\n",$buffer);
$tok=strtok($buffer,"\n");
while ($tok)
{$tok=strtok("\n");
$strtmp[]=$tok;};

mysql_query("Update `production` set `uploadflag`=1");
foreach ($strtmp as $val){
$korpus='0';
if (empty($val))  break;
$rublic=trim(strtolower(strtok($val,$separator)));
$pgroup=trim(strtolower(strtok($separator)));
$name=htmlspecialchars(trim(strtok($separator)));
$about=htmlspecialchars(trim(strtok($separator)));
$korpus=htmlspecialchars(trim(strtok($separator)));
$rozn=str_replace(",",".",trim(strtolower(strtok($separator))));
$mopt=str_replace(",",".",trim(strtolower(strtok($separator))));
$lopt=str_replace(",",".",trim(strtolower(strtok($separator))));
$mbopt=trim(strtolower(strtok($separator)));
$opt=str_replace(",",".",trim(strtolower(strtok($separator))));
$count=trim(strtolower(strtok($separator)));
mysql_query("insert into `production`( `rublica` , `group` , `name` , `about` , `korpus` , `roznica` , `lopt` , `opt` , `cout` , `id` , `file` , `folder` , `uploadflag` , `mopt` , `mbopt` ) values ('$rublic', '$pgroup','$name', '$about', '$korpus', '$rozn','$lopt','$opt','$count','', '0', '0','0','$mopt','$mbopt') on duplicate key update `uploadflag`='0',`opt` ='$opt',`roznica`='$rozn',`lopt`='$lopt',`cout`='$count',`mopt`='$mopt',`mbopt`='$mbopt' ");
echo mysql_error();
 };
mysql_query("DELETE FROM `production` WHERE `uploadflag`=1");
mysql_query("OPTIMIZE TABLE `production`");
...

Смысл в том,что он принимает файл csv и парсит его в базу.На небольших файлах вроде всё нормально.На больших:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 4176851 bytes) in /home/ххх/pr3.php on line 19*Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 4176851 bytes) in /home/eleklan9/public_html/admin/price3.php on line 19
 Прислоутую 19-ю строчку я выделил в коде звеждочками .Я так полагаю это происходит из-за переполнения памяти..Как можно решить возникшую проблему?

спустя 4 минуты [обр] Василий Свиридов(53/175)[досье]
Найти в php.ini настройку лимита памяти и поставить побольше.
Или-же не пытаться прочитать весь файл сразу, а читать его построчно. И не забывайте про fgetcsv.
спустя 51 минуту [обр] Marat Tanalin(3/78)[досье]
Читать последовательными фрагментами, конечно.
спустя 1 месяц 4 дня [обр] Igor Rulyov(0/19)[досье]
Я писал "читалку" csv (до 20мб).
...
$csvFile = 'dummy.csv';
setlocale(LC_ALL, 'de_DE.UTF8');
$csvMaxLineLength = intval(exec('cat ' . $csvFile . ' | wc -L'))+100; # с запасом?
$csvSeparator = ';';
if ($fp = fopen($csvFile, 'r')) {
 while (($csvLine = fgetcsv($fp, $csvMaxLineLength, $csvSeparator))!==FALSE) {
  var_dump($csvLine);
 }
}
...
Powered by POEM™ Engine Copyright © 2002-2005