Импортирование из csv в мускул.

N3K

Новичок
Импортирование из csv в мускул.

У меня есть функция добавления большого кол-ва эллементов из csv файла в базу данных. Импортирование нужно встроить в проэкт. Добавляю я в базу данных сразу по 1000 строк. Ошибка заключается в том, что после 2х - 10 добавлений ложится апачь. В коде сделал множество обработчикво, что б небыло большого буфера у апача и у мускула. Написано на зенд фреймвёрке, но в данном случае работа идёт на прямую с адаптером базы данных. Вот куски кода 2х функций:
1. Отвечает за получение информации из текстовика + следим за буфером:
PHP:
public function indexAction()
	{
		$file = fopen ('../temp/db/partner.last.dump3','r');
		$elements=array();
		$pos=0;
		while (!feof($file)) {
			$str = fgets($file);
			if ($str [0] == 'p' && $str [1] == '_') { //проврка - я вляеится ли поле обозначением начала новой таблицы
				if (isset($table)) { // Если название таблицы существет, значит уже одну таблицу обработали
					$this->insertModel->insertArray($elements,$cols,$table); // передаём в функцию инсёрта данные
					$elements=array(); // очищаем буфер
					$pos=0;
					#exit(0);
				}
				$table=strtok($str,'|'); // получаем название новой таблицы
				
				$cols=$this->insertModel->getCols($table); // получаем названия её полей
			} else // если полученное поле не является названием новой таблицы
				if ($pos==10000) { // Если полей для добавления == 10000
					$this->insertModel->insertArray($elements,$cols,$table); // Добавляем их 
					$elements=array();                                                        // и обнуляем счётчик(опять же дял экономии буфера)
					$pos=0;
				}
				$arrayElements=explode('|',$str);  // разбитие полученной строки на под строки(значения в бд)
				$a=0;
				foreach ($arrayElements as $element) { // цыкл прообразующий два масива в асоциативный масив типа [tableName] => element
					$resultArray[$cols[$a]]=$element;
					$a++;
				}
				$elements[]=$resultArray; // собраем эллементы в массив
				$pos++;
			}
		}
	}
2. Отвечает за добавление в базу данных (берёт из 10000 эллементво значения и добавляет их в базу данных по 1000)
Добавление осуществляется на прямую через адаптер.
PHP:
public function insertArray( array $data, array $cols , $table)
    {
$this->_name=$table;
        $sql = "INSERT INTO $this->_name ";
        $sql.=' (';
        for ($a=0,$count=count($cols);$a<$count;$a++) { // Делаем начало запроса в виде INSERT INTO table (....) values
             if ($a>0) {
                  $sql.=',';
             }
             $sql.='`' . $cols[$a] . '`';
        }
        $sql.=' ) values';
        
         $count2 = count( $data );
         $values = '';
         try {
               $this->_db->getConnection();
               for ( $i = 0; $i < $count2; $i++ ){ 
                    $countCols  = count( $data[$i] );
                    $data[$i]['_name'] = mb_convert_encoding($data[$i]['_name'], 'UTF-8'); 
                    $data[$i]['_name'] = $this->_db->quote( $data[$i]['_name'] ); 
                    
                    $sql.='  (';
                    $a=0;
                    foreach ($data[$i] as $element) { // добавляем эллементы в запрос
                              if ($a>0) {
                                   $sql.=',';
                              }
                              $sql .= $element;
                              $a++;
                    }
                    $sql.='),';  
                    if ( $i != 0 && $i%1000 == 0 ){ // отчёт 1000 эллементов
                         $sql = substr( $sql, 0, strlen( $sql )-1 ); // обризаем последнюю запятую
                        $sql .= ';'; 
                        
                        $this->_db->query($sql);  // сам запрос
                        $sql = "INSERT INTO $this->_name "; //строим овое тело для следующей тысячи эллементов
                        $sql.=' (';
                        for ($a=0,$count1=count($cols);$a<$count1;$a++) {
                             if ($a>0) {
                                  $sql.=',';
                             }
                             $sql.='`' . $cols[$a] . '`';
                        }
                        $sql.=' ) values';                         
                    } 
               } 
         }
...
Подскажите, из за чего ложится апачь? Уже часов 5 мучаюсь.
P.s. Добавление глючит на адаптере pdo_mysql. На mysqli работает корректно, но это недопустимо в проэкте.
 

programmer_2006

Новичок
Re: Импортирование из csv в мускул.

Стало интересно почему на pdo адаптере глохнет а на mysqli нет... P.S. поменять адаптер можно, это не кретично
 
Сверху