parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Добавление большого кол-ва строк в базе данных без LOAD DATA INFILE

Никита Козин 27.06.2006 15:24

Задача. Написать скрипт, принимающий POST-данными пять таб-разделенных таблиц и добавляет их в базу данных, предварительно очистив старые данные в базе. Возвращать статус операции.

Условие. Порядок полей жестко задан и они соответствуют полям в базе данных. На хостинге нет MySQL-привелегии для работы с файлами (LOAD DATA IN FILE)

Решение.
@auto[]
$response:body[]
$response:status(210)
$die(0)
$data[
	$.ts[^create[ts](1)[id	cat_ts	cat_ts2	cena_h	cena_min]]
	$.cat_ts[^create[cat_ts](2)[id	name]]
	$.cat_ts2[^create[cat_ts2](3)[id	id_cat	name	inprice]]
	$.harak[^create[harak](4)[id	cat_ts	name	ed]]
	$.harakdb[^create[harakdb](5)[id	idts	catts	idhar	value]]
]
^debug:print[$data][/../temp/data.html]
# end @auto[]


@create[name;status;columns]
^if(!$die){
	$result[^table::create{$columns}]
	^try{
		^result.join[^table::create{^taint[as-is][$form:[$name]]}]
		^if(!^result.count[]){
			$response:status(420 + $status)
			$die(1)
	 	}{
			^MAIN:pSQL.void{TRUNCATE TABLE $name}
			^insert[$name;$columns;$result]
		}
	}{
		$exception.handled(0)
		$response:status(520 + $status)
		$die(1)
	}
}
# end @create[]


@insert[table_name;columns;data][n]
$counter(0)
^while($counter < ^data.count[]){
	^MAIN:pSQL.void{
		INSERT INTO
			$table_name (
				^columns.menu{$columns.piece}[,]
			)
		VALUES
			^for[i](0;99){
				^if(($counter + $i) < ^data.count[]){
					^data.offset[set]($counter + $i)
					(
						^columns.menu{'$data.[$columns.piece]'}[,]
					)
					^if(^data.line[] < ^data.count[] && $i < 99){,}
				}
			}
	}
	^counter.inc(100)
}
# end @insert[]
Проблема. В одной из таблиц ~7500 записей. Не хватает памяти на процесс. (Разбивка на порции с while, против menu, помогла, но не сильно. Все равно не хватает памяти.

Как можно оптимизировать скрипт?
(Эх, можно было бы LOAD DATA INFILE...)