将数据从PostgreSQL复制到CouchDB

将数据从PostgreSQL复制到CouchDB,postgresql,couchdb,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) -&g

我有一个简单的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).'...';
        }
    }
}
$cc=新couchClient('http://localhost:5984","投票站",;
对于($i=0;$i<107000000;$i+=100000){
//dibi数据库层的使用
$data=dibi::select('*')->from('posts\u vows'))
->抵销(一美元)
->限额(100000);
foreach($n=>$row数据){
$doc=新的stdClass();
$doc->post\u id=$row->post\u id;
$doc->date=$row->date->format('Y-m-dh:i:s');
$doc->upvoces=$row->upvoces;
$cc->storeDoc($doc);
如果(($i+$n)%1000==0){
回声($i+n)。“…”;
}
}
}
但是这个脚本每分钟能够复制大约8500条记录(在没有Apache的情况下直接通过PHP运行脚本时),如果我需要复制约100000条记录,那么速度就不会那么快了


有什么方法可以更快地完成吗?

查看
storeDocs()
方法,而不是
storeDoc()
。storeDocs(复数)将使用CouchDB
\u bulk\u docs
API,这将更快

也许你可以通过实验找到最佳的批量大小

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

问题的一部分可能是,在处理它们之前,每次都要在内存中获取10万行。这可能是好的老pdo将更好地工作的情况之一

  • 选择post\u id、date、upvocesfrom posts\u voces
    创建并执行PDO语句(可选带有限制和偏移)

  • 使用:
    while($row=$stmt->fetch(DO::fetch_OBJ))

  • 这样,一次只能创建一个对象

    不过,更快的方法可能是从psql中构建一个巨大的couchdb语句,并使用输出在couchdb中大容量加载内容。我不确定沙发的确切语法,但这里有一个让您开始的基础:

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

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

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


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

    dibi类是什么?它看起来很整洁。@Denis它是一个轻量级数据库层-不幸的是,没有完整的英文文档和教程等。CouchDB不需要API包装器或“数据库层”。事实上,这些对CouchDB用户来说弊大于利。速度快得多。太棒了!如果您需要另一个提升,下一步就是使用线程或其他技术并行地完成它们。这将再次给您带来类似的性能提升,并且您将接近CouchDB主机的硬件速度。(就我个人而言,我不做很多并行导入,因为只导入一次不值得调试,但这是一个很好的选择!)