2014-02-02 3 views
3

Я пытаюсь вставить документы навалом. Но он не вставляет более 84 документов в объемную вставку. дает мне эту ошибку:Pymongo bulk inserts

in insert pymongo.errors.InvalidOperation: cannot do an empty bulk insert 

Можно ли делать пакетные вставки, как вставки 50 документов в вкладыш?

+0

Это возможно сделать [объемные вставки] (http://api.mongodb.org/python/current/tutorial.html#bulk-inserts) с PyMongo. Сообщение об ошибке предполагает, что у вас может не быть синтаксиса совершенно правильно. Можете ли вы поделиться своим кодом вставки? Кроме того, какую версию PyMongo и Python вы используете? – Stennie

+0

Python 2.6, Pymongo 2.6.3 – blackmamba

+1

Если синтаксис неверен, тогда он не должен вставлять какой-либо документ, не так ли? – blackmamba

ответ

0

Уже ответил здесь: Mongodb bulk insert limit in Python

Вам не нужно делать массовую вставку. Просто вставьте итерацию, и Pymongo будет нести ответственность за распределение данных в максимальный размер байта или сбор вставляемых данных в течение некоторого времени, пока не достигнет максимального размера байта, прежде чем массировать его в базу данных.

У самого Mongodb есть ограничение на размер сообщения (maxMessageSizeBytes), равное 48000000 байт (maxBsonObjectSize * 3).

0

Поздно к игре здесь, но у вас были хорошие успехи с описанными здесь объемными операциями (http://api.mongodb.com/python/current/examples/bulk.html). Метод insert_many() уже выполняет необходимое разделение под капотом. Мой рабочий процесс включал одну большую «объемную вставку», а затем многие последующие полные обновления коллекции. Использование процесса массового обновления было во много раз быстрее, чем зацикленное однократное обновление. Однако увеличение скорости% варьировалась в зависимости от размера входа (10, 100, 1000, 1

def unordered_bulk_write(): 
    bulk_op = collection.initialize_unordered_bulk_op() 

    for primary_key in primary_key_list: 
     bulk_op.find({'fubar_key': primary_key}).update({'$set': {'dopeness_factor': 'unlimited'}}) 

    try: 
     bulk_op.execute() 
    except Exception as e: 
     print e, e.details 

def single_update_write(): 
    for primary_key in primary_key_list: 
     collection.update_one({'fubar_key': primary_key}, {'$set': 
     {'dopeness_factor': 'unlimited'}}) 

Эти методы работают в МПГ ноутбук с %%timing магии и я получил следующие характеристики. Методы были называется в карте в течение определенного фрагмента случайным образом выбранных первичных ключей с увеличением размеров порций.

WITH CHUNK_SIZE = 10 
UNORDERED BULK WRITE = 1000 loops, best of 3: 871 µs per loop 
SINGLE UPDATE ONE = 100 loops, best of 3: 2.47 ms per loop 

WITH CHUNK_SIZE = 100 
UNORDERED BULK WRITE = 100 loops, best of 3: 4.57 ms per loop 
SINGLE UPDATE ONE = 10 loops, best of 3: 26.2 ms per loop 

WITH CHUNK_SIZE = 1000 
UNORDERED BULK WRITE = 10 loops, best of 3: 39 ms per loop 
SINGLE UPDATE ONE = 1 loops, best of 3: 246 ms per loop 

WITH CHUNK_SIZE = 10000 
UNORDERED BULK WRITE = 1 loops, best of 3: 399 ms per loop 
SINGLE UPDATE ONE = 1 loops, best of 3: 2.58 s per loop 

WITH CHUNK_SIZE = 100000 
UNORDERED BULK WRITE = 1 loops, best of 3: 4.34 s per loop 
SINGLE UPDATE ONE = 1 loops, best of 3: 24.8 s per loop 
0

Просто поддерживать флаг отслеживать погоду есть что-то, чтобы выполнить в объемном операции. Таким образом, вы можете избежать исключения и сделать db.

bulk_operation = collection.initialize_unordered_bulk_op() 
execute_bulk = False 
for _id in _ids: 
    bulk_operation.find({'_id': _id}).update({'$set': {'key': 'value'}}) 
    execute_bulk = True 

if execute_bulk: 
    bulk_operation.execute() 
Смежные вопросы