Я пытаюсь вставить DataFrame pandas в базу данных Postgresql (9.1) наиболее эффективным способом (используя Python 2.7).
Использование «cursor.execute_many» очень медленное, как и «DataFrame.to_csv(buffer,...)» вместе с «copy_from».
Я нашел уже много! более быстрое решение в Интернете (http://eatthedots.blogspot.de/2008/08/f ... copgs.html), которое я адаптировал для работы с пандами.
Мой код можно найти ниже.
Мой вопрос заключается в том, можно ли легко перенести метод этого связанного вопроса (с использованием «копирования из стандартного ввода с двоичным кодом») для работы с DataFrames и будет ли это намного быстрее.
Используйте двоичную таблицу COPY FROM с psycopg2
К сожалению, моих навыков Python недостаточно, чтобы понять реализацию этого подхода.
Это мой подход:
import psycopg2
import connectDB # this is simply a module that returns a connection to the db
from datetime import datetime
class ReadFaker:
"""
This could be extended to include the index column optionally. Right now the index
is not inserted
"""
def __init__(self, data):
self.iter = data.itertuples()
def readline(self, size=None):
try:
line = self.iter.next()[1:] # element 0 is the index
row = '\t'.join(x.encode('utf8') if isinstance(x, unicode) else str(x) for x in line) + '\n'
# in my case all strings in line are unicode objects.
except StopIteration:
return ''
else:
return row
read = readline
def insert(df, table, con=None, columns = None):
time1 = datetime.now()
close_con = False
if not con:
try:
con = connectDB.getCon() ###dbLoader returns a connection with my settings
close_con = True
except psycopg2.Error, e:
print e.pgerror
print e.pgcode
return "failed"
inserted_rows = df.shape[0]
data = ReadFaker(df)
try:
curs = con.cursor()
print 'inserting %s entries into %s ...' % (inserted_rows, table)
if columns is not None:
curs.copy_from(data, table, null='nan', columns=[col for col in columns])
else:
curs.copy_from(data, table, null='nan')
con.commit()
curs.close()
if close_con:
con.close()
except psycopg2.Error, e:
print e.pgerror
print e.pgcode
con.rollback()
if close_con:
con.close()
return "failed"
time2 = datetime.now()
print time2 - time1
return inserted_rows
Подробнее здесь: https://stackoverflow.com/questions/982 ... g-psycopg2
Быстрая вставка DataFrame pandas в БД Postgres с помощью psycopg2 ⇐ Python
Программы на Python
-
Anonymous
1770901495
Anonymous
Я пытаюсь вставить DataFrame pandas в базу данных Postgresql (9.1) наиболее эффективным способом (используя Python 2.7).
Использование «cursor.execute_many» очень медленное, как и «DataFrame.to_csv(buffer,...)» вместе с «copy_from».
Я нашел уже много! более быстрое решение в Интернете (http://eatthedots.blogspot.de/2008/08/faking-read-support-for-psycopgs.html), которое я адаптировал для работы с пандами.
Мой код можно найти ниже.
Мой вопрос заключается в том, можно ли легко перенести метод этого связанного вопроса (с использованием «копирования из стандартного ввода с двоичным кодом») для работы с DataFrames и будет ли это намного быстрее.
Используйте двоичную таблицу COPY FROM с psycopg2
К сожалению, моих навыков Python недостаточно, чтобы понять реализацию этого подхода.
Это мой подход:
import psycopg2
import connectDB # this is simply a module that returns a connection to the db
from datetime import datetime
class ReadFaker:
"""
This could be extended to include the index column optionally. Right now the index
is not inserted
"""
def __init__(self, data):
self.iter = data.itertuples()
def readline(self, size=None):
try:
line = self.iter.next()[1:] # element 0 is the index
row = '\t'.join(x.encode('utf8') if isinstance(x, unicode) else str(x) for x in line) + '\n'
# in my case all strings in line are unicode objects.
except StopIteration:
return ''
else:
return row
read = readline
def insert(df, table, con=None, columns = None):
time1 = datetime.now()
close_con = False
if not con:
try:
con = connectDB.getCon() ###dbLoader returns a connection with my settings
close_con = True
except psycopg2.Error, e:
print e.pgerror
print e.pgcode
return "failed"
inserted_rows = df.shape[0]
data = ReadFaker(df)
try:
curs = con.cursor()
print 'inserting %s entries into %s ...' % (inserted_rows, table)
if columns is not None:
curs.copy_from(data, table, null='nan', columns=[col for col in columns])
else:
curs.copy_from(data, table, null='nan')
con.commit()
curs.close()
if close_con:
con.close()
except psycopg2.Error, e:
print e.pgerror
print e.pgcode
con.rollback()
if close_con:
con.close()
return "failed"
time2 = datetime.now()
print time2 - time1
return inserted_rows
Подробнее здесь: [url]https://stackoverflow.com/questions/9826431/fast-insertion-of-pandas-dataframe-into-postgres-db-using-psycopg2[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия