有可能加快phpQuery的速度吗?
我试图读取一个12MB+的文件,该文件有一个大的HTML表,如下所示:有可能加快phpQuery的速度吗?,php,performance,phpquery,Php,Performance,Phpquery,我试图读取一个12MB+的文件,该文件有一个大的HTML表,如下所示: <table> <tr> <td>a</td> <td>b</td> <td>c</td> <td>d</td> <td>e</td> </tr> <tr>
<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>
A.
B
C
D
E
A.
B
C
D
E
..... 最多20000多行。。。。
现在我就是这样刮的:
<?
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...
?>
我的基准测试表明,大约需要5.25个小时来刮取1000行并将其插入数据库。考虑到这些数据,仅仅完成整个20000多行大约需要5天的时间
我的本地计算机正在运行:
- XAMPP
- 赢7
- 程序,i3 2100 3.1GHz
- ram,G.技能RipJaws X 4GB双
- 硬盘驱动器,旧SATA
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...
?>
($i=1;$i 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();
}
//要在此处插入到db的代码。。。
?>
我从未使用过phpQuery,但这似乎是解析大型文档的一种次优方式:每次使用tr:eq('.$I')加载一行时,phpQuery都可能需要遍历整个过程。
更直接(也可能更快)的方法是简单地遍历文档的每个tr
元素,并在foreach
循环中处理每个元素的子元素。您甚至不需要phpQuery
请参阅以了解各种解决方案。@IMB如果HTML是干净的,那就没关系。但是,您可以先尝试使用phpQuery,您只需改变方法:让phpQuery一次性加载所有
tr
s(即所有名为tr
的表的子级),然后遍历它们。这可能已经快了好几个数量级了HTML并不是很干净。我有点明白你说的,但除了我上面所做的,我不知道如何在代码中做到这一点。我如何加载所有的TR而不遍历每一个?我将不得不进行双foreach,以使每个TDs正确?听起来更慢不过我是。@IMB相信我,它可能会快得多。按照你现在的做法,它可能需要在每次迭代时解析整个文档。我不知道phpQuery是如何实现的,但这几乎肯定是最次优的方式。你说得对,谢谢。我重新考虑了你说的话,我每个只需要一个。我编辑我修改了上面的代码,现在快了20%。虽然我认为它甚至可以更快LOL,但你觉得呢?@IMB mmm,这仍然不是我的意思。我的意思是一次加载所有的孩子。等等,我会找一个例子。你应该使用一个现成的表提取库,而不是自己收集数据。(例如,尽管你必须注意正则表达式是否足够健壮,适合你的情况。)@mario phpQuery不是已经是一个现成的库了吗?