Можно ли ускорить phpQuery? - PullRequest
       22

Можно ли ускорить phpQuery?

0 голосов
/ 10 ноября 2011

Я пытаюсь прочитать 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... 

?>

Мой тест говорит, что на чистку и вставку 1000 строк в дб уходит около 5,25 часа.Учитывая эти данные, потребуется всего 5 дней, чтобы закончить все 20 000+ строк.

Моя локальная машина работает на:

  • XAMPP
  • Win 7
  • proc, i3 2100 3,1 ГГц
  • ram, G.Skill RipJaws X 4 ГБ dual
  • HDD, старый 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... 

?>

1 Ответ

2 голосов
/ 10 ноября 2011

Я никогда не работал с phpQuery, но это выглядит как очень неоптимальный способ разбора огромного документа: возможно, phpQuery должен проходить через все это каждый раз, когда вы загружаете его строка, используя tr:eq('.$i.').

Гораздо более простым (и, вероятно, гораздо более быстрым) способом было бы просто пройтись по каждому элементу tr документа и работать с потомками каждого элемента в цикле foreach. Для этого вам даже не понадобится phpQuery.

См. Как анализировать XML-файл в PHP для различных решений.

...