【发布时间】:2011-11-10 18:23:30
【问题描述】:
我正在尝试读取一个 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...
?>
我的基准测试表明大约需要 5.25 小时才能将 1,000 行数据抓取并插入到数据库中。鉴于这些数据,完成全部 20,000 多行大约需要 5 天时间。
我的本地机器正在运行:
- XAMPP
- 赢 7
- 处理器,i3 2100 3.1GHz
- 内存,G.Skill RipJaws X 4GB 双
- 硬盘,旧 SATA
有什么方法可以加快这个过程吗?也许我刮错了?请注意,该文件可在本地访问,因此我使用了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...
?>
【问题讨论】:
-
您应该使用现成的表格提取库,而不是自己收集数据。 (例如blog.mspace.fm/2009/10/14/parse-an-html-table-with-php - 尽管您必须注意该正则表达式对于您的情况是否足够健壮。)
-
@mario phpQuery 不是已经是现成的库了吗?
标签: php performance phpquery