2016-07-28 3 views
0

Привет, ребята, в настоящее время я пытаюсь перенести текущий db в другой, и к этому процессу, к сожалению, относится python. Я смог сделать это однопоточным, но невероятно медленно потребовалось несколько часов, чтобы закончить 1M-данные. Есть ли аналогичный метод в python, например, Java-исполнитель и фьючерсы?Многопоточный Python для DB Insert

отмечают, что user_list является кусок 1000/1M

for data in user_list: 
    q = """ insert into users(id,name,address,password) 
     Values({id},{name},{address},{password}) 
     """.format(id=data['id'],name=data['name'],address=data['address'],password=data['password']) 
    db.command(q) 

Я думаю, что это было бы гораздо быстрее, если я бегу к примеру 8 параллельных потоков вставляя 8 в то время вместо одной нити делает единственную вставку

+0

Какая вы используете DB? Это может быть быстрее, но для каждого потока вам потребуется отдельное соединение db. Сначала я увижу, поддерживает ли ваша БД «объемные вставки» или «пакетные вставки» - обычно это намного быстрее, чем вставка одной строки за раз. – ErikR

+0

А, так что я не могу использовать 1 соединение для одновременного ввода n? Я импортирую sql в orientdb на данный момент. @ErikR – kenlz

+0

Нет - вам потребуется одно соединение на поток. Также см. Мой ответ. – ErikR

ответ

1

Поскольку вы говорите в комментариях, что используете eastdb, посмотрите на SQL Batch.

Использование SQL BATCH не вставляет строки параллельно, но это позволит избежать взаимной поездки для каждой команды.

Вы также можете использовать SQL ПАРТИЮ из Python с использованием библиотеки pyorient:

https://github.com/mogui/pyorient#execute-orientdb-sql-batch

Для вставки данных параллельно вам нужно будет создать несколько соединений, один для каждого потока.

+0

Yup закончил использование SQL Batch, но вместо разбора каждого столбца я закончил экспорт отдельных CSV в качестве классов. Вот бы и сейчас. Спасибо :) – kenlz

Смежные вопросы