Параллельное выполнение зависимых запросов к базе данных - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть простой скрипт, который извлекает около 100 миллионов результатов, по 1 миллиону за раз с удаленного сервера MySQL, и обновляет мою локальную базу данных.Удаленный сервер не находится под моим контролем, поэтому выполнить автоматическую настройку главного / подчиненного устройства невозможно.Для нормального выполнения требуется несколько часов, но я понял, что часть кода, которая извлекает результаты с удаленного сервера, и часть кода, которая обновляет локальные записи, занимают примерно одинаковое количество времени для выполнения.Таким образом, теоретически я мог бы сократить время выполнения почти вдвое, если я получу следующий пакет строк с удаленного сервера во время обновления локальных записей.Я видел пример кода для параллельных запросов к базе данных в PHP (например, вопрос 322275 ), но я не могу придумать, как заставить его работать с циклом обновления foreach в моем скрипте.Возможно ли это в PHP или мне лучше сделать это на другом языке, например Python или Ruby (хотя у меня нет опыта работы с ними)?

Редактировать : Также удаленный сервернаходится на полпути вокруг света, поэтому задержка сети довольно высока.

Пример кода:

for ($i = 0; $i < 100; $i++)
{
    $min = $i * LIMIT;
    $max = ($i + 1) * LIMIT;

    $updates = $db_remote->fetchAll("SELECT * FROM table_name WHERE content_id >= $min AND content_id < $max"); // Pull 1 million results from the remote SQL server

    foreach ($updates as $u)
    {
        $db_local->update("UPDATE table_name SET ... WHERE content_id = $u['content_id'] LIMIT 1"); // Update each of the local entries
    }
}

1 Ответ

0 голосов
/ 01 апреля 2012

Возможно, вы захотите проверить http://php.net/manual/en/function.pcntl-fork.php

Если ваш удаленный запрос завершен, вы можете начать обновление базы данных и завершить процесс, чтобы начать выборку следующего набора данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...