用巨大的数组填充表
Posted
技术标签:
【中文标题】用巨大的数组填充表【英文标题】:Populating a Table with an Immense Array 【发布时间】:2012-05-08 19:10:38 【问题描述】:我正在尝试使用从页面中抓取的内容填充表格。问题是,近二十万个项目同时被插入,破坏了系统。我得到错误:
警告:mysql_query() [function.mysql-query]: MySQL 服务器已在第 15 行的 C:\xampp\htdocs\testing\scrabble2.php 中消失
警告:mysql_query() [function.mysql-query]:在第 15 行的 C:\xampp\htdocs\testing\scrabble2.php 中读取结果集的标头时出错
无法添加项目: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);
?>
那么我怎样才能用这么大的数组填充我的表呢?
【问题讨论】:
我一看到问题和“ScrabbleWords”这个词就笑了哈哈。 MySQL 服务器不应该只是“走开”——检查 mysql_error 的日志输出...可以在 /var/log/mysql/mysql_error 中找到(默认情况下) 如果您只想要拼字游戏单词列表,以便可以使用 LOAD DATA 在本地加载它,您可以在此处获取它们:edcollins.com/jamble 或 isc.ro/lists/twl06.zip 【参考方案1】:使用MySQLextended 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);
【讨论】:
这个建议将使您从 200,000 个 INSERT 语句增加到 200 个插入语句(假设您一次执行 1000 个单词) 如果我知道你的意思,这似乎是最优雅的答案。原谅我的无知,我的追求是真诚的。如何循环这些词的分组?在我将它们分组后,每个组都存储在一个变量中吗?在您的示例中,“Word1”、“Word2”等的值是什么?【参考方案2】:尝试像这样使用插入:
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');
【讨论】:
【参考方案3】:为什么 MySQL 服务器会消失。
如果您向服务器发送不正确或太大的查询,您可能会收到这些错误。如果 mysqld 收到一个太大或乱序的数据包,它会认为客户端出现问题并关闭连接。如果您需要大查询(例如,如果您使用大 BLOB 列),您可以通过设置服务器的
max_allowed_packet
变量来增加查询限制,该变量的默认值为 1MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参阅第C.5.2.10
部分,“数据包太大”。
Source link
这可能是也可能不是你问题的答案,但我认为这是最可能的原因。
【讨论】:
以上是关于用巨大的数组填充表的主要内容,如果未能解决你的问题,请参考以下文章