Я переезжаю данные из Mysql в Postgres и мой код, как показано ниже -MySql FetchMany Проблемы памяти
import os, re, time, codecs, glob, sqlite3
from StringIO import StringIO
import psycopg2, MySQLdb, datetime, decimal
from datetime import date
import gc
tables = (['table1' , 27],)
conn = psycopg2.connect("dbname='xxx' user='xxx' host='localhost' password='xxx' ")
curpost = conn.cursor()
db = MySQLdb.connect(host="127.0.0.1", user="root", passwd="root" , unix_socket='/var/mysql/mysql.sock', port=3306)
cur = db.cursor()
cur.execute('use xxx;')
for t in tables:
print t
curpost.execute("truncate table " + t[0])
cur.execute("select * from "+ t[0])
a = ','.join('%s' for i in range(t[1]))
qry = "insert into " + t[0] + " values (" + a +")"
print qry
i = 0
while True:
rows = cur.fetchmany(5000)
if not rows: break
string = ''
for row in rows:
string = string + ('|'.join([str(x) for x in row])) + "\n"
curpost.copy_from(StringIO(string), t[0], sep="|", null="None")
i += curpost.rowcount
print i , " loaded"
curpost.connection.commit()
del string, row, rows
gc.collect()
curpost.close()
cur.close()
Для небольших таблиц, код работает нормально. Однако более крупные (3,6 миллиона записей), в тот момент, когда выполняется mysql (cur.execute («select * from» + t [0])), использование памяти на компьютере увеличивается. Это даже несмотря на то, что я использовал fetchmany, и записи должны поступать только в партиях 5000. Я также пробовал 500 записей и их же. Для больших таблиц кажется, что fetchmany не работает, как документировано.
Редактировать - я добавил сборку мусора и заявления del. Тем не менее память продолжает раздуваться, пока все записи не обрабатываются.
Любые идеи?
Его 20 минут в настоящее время, использование оперативной памяти составляет около 4 Гб, даже 5000 записей processe d :-( – myloginid
Что вы подразумеваете под ** не работает, как задокументировано ** Не могли бы вы дать мне ссылку, пожалуйста? – Alex
http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-fetchmany.html – myloginid