我在 virtualbox 的 Linux 上运行 php + yii2 + mongodb(10 核,12 GB RAM)。 yii2-mongodb 已安装。我有一个 csv 文件,其中包含 2 列 100.000 多条记录:自定义标识符(不是 _id)和一个数字。我想将编号添加到 mongodb 集合中的文档中,其中自定义标识符与文档匹配。我尝试了几种不同的方法,例如 1.
$collection->update()
循环中的 while(fgetcsv)
,2. 尝试在 while()
中创建一个数组,例如:
$ops = [];
while(fgetcsv...) {
array_push($ops, [ 'updateOne' => [ [ 'identifier' => $csvrow[0] ], [ '$set' => [ 'number' => $csvrow[1] ] ] ] ]);
}
$conn->createCommand()->addUpdate($ops)->executeBatch('collection');
它可以工作,但是速度非常慢。每秒 10-20 条记录。我尝试将 text 索引添加到 mongodb compass 中的自定义标识符(我有 1(asc)、-1(desc)、2dsphere 和 text),但没有获得性能提升。我错过了什么?
看起来您没有创建索引或者创建了错误的索引。用这个
db.collection.createIndexes([ { identifier: 1 } ], { unique: true })
通过使用 bulkWrite 它应该会变得更快。为了避免“内存不足”问题,我建议
$ops = [];
while(fgetcsv...) {
array_push($ops, [ 'updateOne' => [ [ 'identifier' => $csvrow[0] ], [ '$set' => [ 'number' => $csvrow[1] ] ] ] ]);
if (count($ops)) > 10000 {
$conn->createCommand()->addUpdate($ops)->executeBatch('collection');
$ops = [];
}
}
if (count($ops)) > 0
$conn->createCommand()->addUpdate($ops)->executeBatch('collection');