我正在尝试读取一个12MB +文件,其中包含一个大型HTML表格,如下所示:
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
<td>e</td>
</tr>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
<td>e</td>
</tr>
<tr>..... up to 20,000+ rows....</tr>
</table>
现在我正在抓它:
<?
require_once 'phpQuery-onefile.php';
$d = phpQuery::newDocumentFile('http://localhost/test.html');
$last_index = 20000;
for ($i = 1; $i <= $last_index; $i++)
{
$set['c1'] = $d['tr:eq('.$i.') td:eq(0)']->text();
$set['c2'] = $d['tr:eq('.$i.') td:eq(1)']->text();
$set['c3'] = $d['tr:eq('.$i.') td:eq(2)']->text();
$set['c4'] = $d['tr:eq('.$i.') td:eq(3)']->text();
$set['c5'] = $d['tr:eq('.$i.') td:eq(4)']->text();
}
// code to insert to db here...
?>
我的基准测试表明,刮取并向数据库插入1,000行需要大约5.25小时。鉴于这些数据,只需要5天就能完成整个20,000多行。
我的本地计算机正在运行:
有什么方法可以加快这个过程吗?也许我正在以错误的方式刮它?请注意,该文件可在本地访问,因此我使用了http://localhost/test.html
解决方案稍快:
for ($i = 1; $i <= $last_index; $i++)
{
$r = $d['tr:eq('.$i.')'];
$set['c1'] = $r['td:eq(0)']->text();
$set['c2'] = $r['td:eq(1)']->text();
$set['c3'] = $r['td:eq(2)']->text();
$set['c4'] = $r['td:eq(3)']->text();
$set['c5'] = $r['td:eq(4)']->text();
}
// code to insert to db here...
?>
答案 0 :(得分:2)
我从未使用过phpQuery,但这看起来像是一个解析大文档的非常次优解决方式:phpQuery每次都必须遍历整个事情你使用tr:eq('.$i.')
加载一行。
更简单(也可能更快)的方法是简单地遍历文档的每个tr
元素,并在foreach
循环中处理每个元素的子元素。你甚至不需要phpQuery。
有关各种解决方案,请参阅How to Parse XML File in PHP。