我有一个简单的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条记录。
有什么方法可以更快地做到这一点吗?
答案 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工作得更好的情况之一。
为select post_id, date, upvotes from posts_votes
创建并执行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