Ошибка памяти, когда Excel импортирует данные в MySQL с файла excel

Это получая следующую ошибку:

Фатальная ошибка: Allowed memory size of 33554432 байт exhausted (tried to allocate 2 байт) in C:\xampp\htdocs\servisa\Excel\reader.php он-лайн 482

Я должен читать файл очень большого Excel (13 mb, 9000 линий) и вводить все эти данные о таблице моей базы данных MySQL.

То, что я делаю, состоит в том, чтобы загружать все данные excel в array, и потом я произвожу каждое решение insert пробегая array. Потом я прилагаю каждый insert в единственной гигантской консультации.

Мне казалось, что это было более соответствующим, что реализовывать 9000 inserts в базу данных. Кто-то предлагает какой-то лучший способ это делать, с меньше потреблением памяти?

Спасибо!

Здесь этот my код:

require_once 'Excel/reader.php';
    $data = new Spreadsheet_Excel_Reader();
    $data->setOutputEncoding('CP1251');
    $data->read('PAMI/PAMI.XLS');
    $arreglo = array(array());
    for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) 
    {
        if ($i == 1)
            continue;

        $nomCompleto = mysql_real_escape_string($data->sheets[0]['cells'][$i][3]);//str_replace("`", "", str_replace("'", "", $data->sheets[0]['cells'][$i][3]));
        $parts = explode(" ", $nomCompleto);
        $apellido = array_shift($parts);
        $nombre = implode(" ", $parts);
        $nroBenef = $data->sheets[0]['cells'][$i][1];
        $dni =  $data->sheets[0]['cells'][$i][5];

        $tipoDni = $data->sheets[0]['cells'][$i][4];
        $sexo = $data->sheets[0]['cells'][$i][8];
        $domicilio = $data->sheets[0]['cells'][$i][9];//mysql_real_escape_string($data->sheets[0]['cells'][$i][9].' '.$data->sheets[0]['cells'][$i][10]);

        $date = str_replace('/', '-', $data->sheets[0]['cells'][$i][6]);
        $fnac = date('Y-m-d', strtotime($date));

        $arreglo[$i][0] = $apellido;
        $arreglo[$i][1] = $nombre;
        $arreglo[$i][2] = $dni;
        $arreglo[$i][3] = $nroBenef;
        $arreglo[$i][4] = $tipoDni;
        $arreglo[$i][5] = $sexo;
        $arreglo[$i][6] = $domicilio;
        $arreglo[$i][7] = $fnac;
    }   

    $sql ="insert into clientespami (apellido,nombre,dni,nroBeneficiario,tipoDni,sexo,domicilio,fechaNac) values ";
    $valuesArr = array();
    foreach($arreglo as $fila)
    {

        $ape = $fila[0];
        $nom = $fila[1];
        $dni = $fila[2];
        $ben = $fila[3];

        $tipo = $fila[4];
        $sex = $fila[5];
        $domi = $fila[6];
        $nac = $fila[7];

        $valuesArr[] = "('$ape', '$nom', '$dni','$ben','$tipo','$sex','$domi','$nac')";
    }

    $sql .= implode(',', $valuesArr);
    //echo $sql;
    mysql_query($sql,$conexion);
    $cant = mysql_affected_rows();
2
задан 11.04.2019, 00:30
3 ответа

Одна из причин состоит в том, что ты создаешь слишком большой array ($valuesArr) и потом convirtiГ©ndolo в string, из-за другой сторона не является рекомендуемой использовать mysql_query, так как он является устаревшим.

я предлагаю Тебе использовать PDO, пример podrГ, - чтобы быть чем-то как это

$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)');
foreach($data as $item) {
    $stmt->bindValue(':a', $item[0]);
    $stmt->bindValue(':b', $item[1]);
    $stmt->bindValue(':c', $item[2]);
    $stmt->execute();
}

PDO

1
ответ дан 03.12.2019, 22:40

Я считаю, что ты должен выполнять рукописный шрифт PHP с командной строки. Не делай это с браузера. Кроме этой формы ты можешь показывать его PHP, что для этого выполнения я распределил неограниченный предел памяти только с sig, я командую:

$ php -d memory_limit=-1 script.php
0
ответ дан 03.12.2019, 22:40

Если это большой файл, идеальное состоит в том, чтобы делать это в travГ©s ее lГ-nea из команды. Также существуют приложения PHP в google, которые делают "strip" файла, и он это делает в части. У Phpmyadmin также есть скрытая функция для больших списков данных.

0
ответ дан 03.12.2019, 22:40