2011-12-14 3 views
0

У меня есть массив, который может содержать до нескольких тысяч элементов (обычно около 5000 элементов). Мне нужно разбить этот массив на сотни и обработать их, а затем продолжить с остальными элементами. До сих пор я обрабатываю весь массив, который медленный. Мой кодСплит-массив PHP в сотнях

foreach($result as $p){ 
       $sqlQuery = mysql_query("INSERT INTO message_details(contact, message_id)VALUES('$p', $message_last_id)"); 
       $last_id = mysql_insert_id(); 
       $xmlString .= "<gsm messageId=\"$last_id\">".$p."</gsm>"; 
       $cnt++; 
      } 

Как я могу обрабатывать элементы в массиве в сотни? Например. 100, затем 200, затем 300 и т.д.

С наилучшими пожеланиями, Никос

+0

Почему бы не использовать 'sleep()' и вернуть SQL-сервер (или что-то еще)? Также обновляйте XML-файл на каждой итерации. –

+0

Зачем обрабатывать куски сотен предметов лучше? – Jon

+0

Шея бутылки может быть самой вставкой. Я бы начал с вставки нескольких строк сразу, используя синтаксис 'INSERT INTO ... VALUES (row1), (row2), ...'. Блокируя таблицу, вы можете получить идентификатор вручную, это последний плюс один. –

ответ

1

Если есть сделать это в коде вы можете использовать функцию PHP array_chunk, чтобы кусок вашего массива в массивы 100 элементов в каждой , Вот документы на array_chunk: link. Но, как указано, это вряд ли будет бутылочной шее.

+0

Это именно то, что мне нужно. $ chunk_result = array_chunk ($ result, 150, true); Еогеасп ($ chunk_result в $ куске) { // здесь код Еогеасп ($ ломоть, как $ р) { // здесь код }} – Nicos

2
foreach($result as $p){ 
    $sqlQuery = mysql_query("INSERT INTO message_details(contact, message_id)VALUES('$p', $message_last_id)"); 
    $last_id = mysql_insert_id(); 
    $xmlString .= "<gsm messageId=\"$last_id\">".$p."</gsm>"; 
    $cnt++; 

    if ($cnt % 1000 == 0) { usleep(100) } 
} 

Вы можете использовать usleep или sleep в зависимости от того, что вы хотите. Я уже использовал это. Вы получаете производительность. Попробуй.

+0

ли это только предотвратить буфер базы данных переполнения и поменять данные в Жесткий диск? Может быть, у меня есть другие последствия, которых я не вижу. –

+0

@MikulasDite Если у вас много данных для вставки в базу данных или буфера SGDB, или вы переполняете память приложения. Один из способов будет затронут так или иначе. Этот метод, который я опубликовал, содержит это исполнение на машине приложения, а не на SGDB. –

+0

Ну, на самом деле это не предотвращает переполнение памяти php, поскольку сборщик мусора, конечно же, не обрабатывает массивы массивов, итерации. Хотя я согласен, что это должно улучшить производительность. Не уверен, в какой степени это может произойти. –

3

Может быть, вы могли бы попробовать это таким образом:

Сначала выберите последний идентификатор MESSAGE_DETAILS.

$sqlQuery = mysql_query("SELECT %last_id_col_name% FROM message_details ORDER BY %last_id_col_name% DESC LIMIT 1".$sInserts); 

затем:

$sInserts = ''; 

foreach($result as $p){ 
    $sInserts .= "('{$p}', {$message_last_id}),"; 
} 

//Remove last "," from Insert-String 
$sInserts = substr($sInserts,0,-1); 

//Insert all with one query 
$sqlQuery = mysql_query("INSERT INTO message_details(contact, message_id)VALUES".$sInserts); 

затем выбрать все записи из этой таблицы, где идентификатор больше, чем тот, который вы выбрали первый и написать

$xmlString .= '<gsm messageId="'.$last_id.'">'.$p.'</gsm>'; 

Если вы делая это таким образом, вам нужны только 3 DB-Queries, а не тысячи.

+0

Auto-increment действительно заботится о идентификаторах, не нужно вводить собственные идентификаторы в запрос вставки. Кроме того, конкатенация строк выглядит ужасно. Я бы пошел с передачей массива в pdo или что-то более высокое. –

+0

Я только адаптировал его вставку. Я не знаю, означает ли '$ message_last_id' идентификатор этой таблицы. Я хотел показать, что нет необходимости делать вставку, каждый цикл. Именно по этой причине сценарий занимает много времени. – mat

Смежные вопросы