将数据从PostgreSQL复制到CouchDB
我有一个简单的PHP脚本:将数据从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
$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))
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主机的硬件速度。(就我个人而言,我不做很多并行导入,因为只导入一次不值得调试,但这是一个很好的选择!)