将数据从PostgreSQL复制到CouchDB

时间:2011-06-23 07:40:08

标签: postgresql couchdb

我有一个简单的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条记录(当没有Apache直接通过PHP解释运行脚本时),这不是那么快,以防我需要复制~100 000 000条记录。

有什么方法可以更快地做到这一点吗?

3 个答案:

答案 0 :(得分:2)

查看storeDocs()方法而不是storeDoc()。 storeDocs(复数)将使用CouchDB _bulk_docs API,速度会快得多。

也许您可以尝试找到最佳的批量大小。

答案 1 :(得分:2)

关于批量插入的guide.couchdb.org摘录:

通过HTTP将数据导入CouchDB的最快模式是_bulk_docs端点。批量文档API在单个POST请求中接受文档集合,并在单个索引操作中将它们全部存储到CouchDB。

批量文档是使用脚本语言导入数据语料库时使用的API。它可以比单个批量更新快10到100倍,并且与大多数语言一样易于使用。

答案 2 :(得分:1)

  

但是这个脚本能够每分钟复制大约8500条记录

部分问题可能是您每次在处理它们之前在内存中获取100k行。这可能是好老pdo工作得更好的情况之一。

  1. select post_id, date, upvotes from posts_votes创建并执行PDO语句(可选择使用限制和偏移量)。

  2. 使用:while ($row = $stmt->fetch(DO::FETCH_OBJ))

  3. 这样你一次只会创建一个对象。

    但是,更快的方法可能是在psql中构建一个巨大的couchdb语句,并使用输出在couchdb中批量加载内容。我不确定精确的沙发语法,但这是帮助你入门的基础:

    select string_agg('{' ||
             'post_id: ' || post_id || ',' ||
             'date: ' || date::timestamp::text || ',' ||
             'upvotes: ' || upvotes ||
           '}', ',
    ')
    from post_votes