Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有可能加快phpQuery的速度吗?_Php_Performance_Phpquery - Fatal编程技术网

有可能加快phpQuery的速度吗?

有可能加快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>

我试图读取一个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>

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不是已经是一个现成的库了吗?