我试图在mongodb中插入1个百万行(PHP)

时间:2016-06-01 06:49:16

标签: php mongodb

我试图在mongodb中插入100万条记录需要花费很多时间 说它可以这么快告诉我,我的代码有什么问题 我使用php来做到这一点

$m = new MongoClient();
$db = $m->mydb;
echo "Database mydb selected";

$collection = $db->createCollection("mycol");
echo "Collection created succsessfully";

$collection = $db->mycol;
echo "Collection selected succsessfully";
for ($i=0; $i<1000000; $i++)
{
    $document = array( 
        "title" => "MongoDB".$i, 
        "description" => "database", 
        "likes" => 100,
        "url" => "http://www.tutorialspoint.com/mongodb/",
        "by" => "tutorials point"
     );

     $collection->insert($document);
}

echo "Document inserted successfully";

2 个答案:

答案 0 :(得分:2)

改为使用Batched / Bulk Inserts

<?php
$m = new MongoClient();

$db = $m->mydb;
echo "Database mydb selected";
$collection = $db->createCollection("mycol");

$db = $m->mydb;
echo "Database mydb selected";
$collection = $db->mycol;

$batchSize = 1000;
$documents = array();
for ($i=0; $i<1000000; $i++)
{
      $documents[] = array( 
            "title" => "MongoDB".$i, 
            "description" => "database", 
            "likes" => 100,
            "url" => "http://www.tutorialspoint.com/mongodb/",
            "by" => "tutorials point"
      );

      // If we've reached `$batchSize` entries, perform the batched insert.
      if (($i+1) >= $batchSize)
      {
            $collection->batchInsert($documents);
            $documents = array();
      }
}

// Finish the last batch.
if (!empty($documents))
{
      $collection->batchInsert($documents);
}

在这里,我们一次插入1000条记录(可通过$batchSize调整)。这需要MongoDB 2.6或更高版本。

答案 1 :(得分:2)

您可以使用MongoDB 2.6及更高版本提供的Bulk Operations API来利用插入操作。当前的PHP驱动程序应该支持这些方法,特别是您需要 MongoWriteBatch 类进行插入操作,特别是使用 MongoInsertBatch <创建一个Insert Write Batch / strong> class:

<?php
    $mc = new MongoClient("localhost");
    $collection = $mc->selectCollection("test", "category");

    $batch = new MongoInsertBatch($collection);
    $counter = 0;

    for($i=0; $i<1000000; $i++) {

        $document = array( 
            "title" => "MongoDB".$i, 
            "description" => "database", 
            "likes" => 100,
            "url" => "http://www.tutorialspoint.com/mongodb/",
            "by", "tutorials point"
        );
        $batch->add($document);
        $counter++;

        if ( $counter % 1000 === 0 ) {
            $ret = $batch->execute(array("w" => 1));
            $counter++;
            $batch = new MongoInsertBatch($collection);        
        }
    }

    if ( $counter > 0 ) {
        $ret = $batch->execute(array("w" => 1));
    }
?>

在上面,在for循环中创建的每个文档都被添加到插入操作中,然后通过.add()方法将其添加到批处理中,并且仅在调用{{1}时发送到服务器}}。有序写入操作按照提供的顺序发送到服务器,以便串行执行。如果写入失败,则将中止任何剩余操作。

有一些&#34;尺寸&#34;的管理。使用模运算实现的这些操作,通常应由驱动程序处理,但如果要检查写入结果,则将其保持在可管理的大小。

这里的关键是,不是等待来自服务器的每次更新的写响应,而是发送操作并在批量生成中响应#34;。减少&#34;开销&#34;在这里进行大规模更新是相当可观的,因为来回减少&#34;来回&#34;与服务器通信时。