Скопируйте данные из PostgreSQL в CouchDB - PullRequest
4 голосов
/ 23 июня 2011

У меня есть простой сценарий PHP:

$cc = new couchClient('http://localhost:5984', 'posts_votes');
for ($i = 0; $i < 107000000; $i += 100000) {
    // Usage of dibi database layer
    $data = dibi::select('*')->from('posts_votes')
        ->offset($i)
        ->limit(100000);
    foreach ($data as $n => $row) {
        $doc = new stdClass();
        $doc->post_id = $row->post_id;
        $doc->date = $row->date->format('Y-m-d H:i:s');
        $doc->upvotes = $row->upvotes;

        $cc->storeDoc($doc);
        if (($i+$n) % 1000 == 0) {
            echo ($i+$n).'...';
        }
    }
}

, но этот сценарий способен копировать приблизительно 8500 записей в минуту (при запуске сценария непосредственно через PHP интерпретировать без Apache), который не так быстроЕсли мне нужно скопировать ~ 100 000 000 записей.

Есть ли способ сделать это быстрее?

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Отрывок из guide.couchdb.org о массовых вставках:

Самый быстрый режим для импорта данных в CouchDB через HTTP - это конечная точка _bulk_docs.API массовых документов принимает набор документов в одном запросе POST и сохраняет их все в CouchDB в одной операции индексации.

Bulk docs - это API, который используется при импорте данных с использованием сценариевязык.Он может быть в 10-100 раз быстрее, чем отдельные массовые обновления, и с большинством языков так же легко работать.

2 голосов
/ 23 июня 2011

Изучите метод storeDocs() вместо storeDoc(). storeDocs (множественное число) будет использовать API CouchDB _bulk_docs, который будет намного быстрее.

Возможно, вы можете поэкспериментировать, чтобы найти лучший размер партии.

1 голос
/ 23 июня 2011

, но этот сценарий способен копировать приблизительно 8500 записей в минуту

Часть проблемы может заключаться в том, что вы извлекаете 100К строк в памяти каждый раз перед их обработкой.Это может быть одним из тех случаев, когда старый добрый pdo будет работать лучше.

  1. создать и выполнить инструкцию PDO для select post_id, date, upvotes from posts_votes (опционально с ограничением и смещением).

  2. Использование: while ($row = $stmt->fetch(DO::FETCH_OBJ))

Таким образом, вы будете создавать объекты одновременно.

Еще более быстрый способтем не менее, скорее всего, было бы построить один огромный оператор couchdb из psql и использовать вывод для массовой загрузки вещей в couchdb.Я не уверен в точном синтаксисе кушетки, но вот основа для начала:

select string_agg('{' ||
         'post_id: ' || post_id || ',' ||
         'date: ' || date::timestamp::text || ',' ||
         'upvotes: ' || upvotes ||
       '}', ',
')
from post_votes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...