2012-04-28 4 views
1

Я пытаюсь заполнить таблицу содержимым, которое я соскабливал со страницы. Проблема в том, что одновременно вставлено около двухсот тысяч предметов, нарушающих систему. Я получаю ошибки:Заполнение таблицы огромным массивом

Предупреждение: mysql_query() [function.mysql-запроса]: MySQL сервер ушел в C: \ XAMPP \ HTDOCS \ тестирование \ scrabble2.php на линии 15

Предупреждение : mysql_query() [function.mysql-запрос]: заголовок Ошибка чтения результирующего набора, в C: \ XAMPP \ HTDOCS \ тестирование \ scrabble2.php на линии 15

не удалось добавить пункт: MySQL сервер ушел

<? 
include('simple_html_dom.php'); 
$html = new simple_html_dom(); 
$html->load_file('http://kisa.ca/scrabble/'); 
$collection = $html->find('.words'); 
$con = mysql_connect("localhost","root","root") or die('Could not connect: ' . mysql_error()); 
mysql_select_db('test') or die('Could not select database: ' . mysql_error()); 
foreach ($collection as $word) 
{ 
    $add_item = "INSERT INTO ScrabbleWords (ID, Words) VALUES ('', '" . $word . "')"; 
    mysql_query($add_item) or die('Could not add item: ' . mysql_error()); 
    echo $word; 
    echo ", "; 
} 
echo "Done"; 
mysql_close($con); 
?> 

Итак, как я могу заполнить таблицу таким большим массивом?

+0

Как только я прочитал вопрос и слово «ScrabbleWords», я засмеялся ха-ха. – Menztrual

+1

Сервер MySQL не должен просто «уходить» - проверить вывод журнала для mysql_error ... можно найти (по умолчанию) в/var/log/mysql/mysql_error – philwinkle

+0

Если вам просто нужен список слов scrabble, чтобы вы могли загрузить он локально с LOAD DATA вы можете получить их здесь: http://www.edcollins.com/jamble/ или http://www.isc.ro/lists/twl06.zip – effulge

ответ

1

Использование MySQL extended inserts, что позволит значительно сократить количество запросов:

INSERT INTO ScrabbleWords (ID, Words) VALUES ('', 'Word1'), ('', 'Word2'), ('', 'Word3'), ...; 

Вы можете перебрать и группироваться сказать 1000 слов в одну вставку в то время.

Вы можете также увеличить тайм-аут соединения MySQL:

ini_set('mysql.connect_timeout', 300); // seconds 
ini_set('default_socket_timeout', 300); 
+1

Это предложение доставит вас от 200 000 инструкций INSERT к 200 вставки (если вы делаете 1000 слов за раз) – GDP

+0

Кажется, это был бы самый элегантный ответ, если бы я знал, что вы имели в виду. Простите мое невежество, мои поиски искренны. Как можно объединить группировку этих слов? После того как я их группирую, каждая группа хранится в переменной? Каковы значения «Word1», «Word2» и т. Д. В вашем примере? – Stackings

0

Попробуйте использовать вставку, как это:

INSERT INTO example 
    VALUES 
    (100, 'Name 1', 'Value 1', 'Other 1'), 
    (101, 'Name 2', 'Value 2', 'Other 2'), 
    (102, 'Name 3', 'Value 3', 'Other 3'), 
    (103, 'Name 4', 'Value 4', 'Other 4'); 
0

Почему сервер MySQL уходит.

Вы можете получить эти ошибки, если вы отправляете запрос на сервер, который является неправильным или слишком большим. Если mysqld получает слишком большой или нестандартный пакет, предполагается, что что-то пошло не так с клиентом и закрывает соединение. Если вам нужны большие запросы (например, если вы работаете с большими столбцами BLOB), вы можете увеличить лимит запроса, установив переменную max_allowed_packet сервера, которая имеет значение по умолчанию 1MB. Вам также может потребоваться увеличить максимальный размер пакета на стороне клиента. Более подробная информация об установке размера пакета приведена в разделе C.5.2.10, «Слишком большой пакет».

Source link

Это может или не может быть ответом на вас проблема, но я думаю, что это было наиболее вероятной причиной.

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