Когда я пытаюсь извлечь 1,5 миллиона строк из таблицы MySQL с помощью сценария Python с MySQLdb, я получаю сообщение об ошибке «Недостаточно памяти» на моем сервере.
После отладки я получил эту информацию.
с SSCoursor или курсором по умолчанию используется только 650 МБ ОЗУ
с SSDictCursor он использует более 2,5 ГБ ОЗУ и вызывает ошибку «Недостаточно памяти»
Это нормально ??? Если нет, то как я могу уменьшить использование памяти для SSDictCursor?
Python версия 2.7.12
try:
print "About to connect to db."
host = '127.0.0.1'
port = int(conf['sshtunnel']['fwdport'])
if rs_env == 'private':
host = conf['db'][data_src]['private']['dbhost']
port = 3306
db = MySQLdb.connect(
host = host,
port = port,
user = conf['db'][data_src][rs_env]['dbuser'],
passwd = conf['db'][data_src][rs_env]['dbpass'],
db = conf['db'][data_src]['db'],
# cursorclass = MySQLdb.cursors.SSCursor)
# use ssdictcursore for fetch rows in server side without out of memory error
cursorclass = MySQLdb.cursors.SSDictCursor)
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit(1)
c = db.cursor()
query = "SELECT * FROM ....."
c.execute(query)
print "\n EXECUTED"
# fetch rows one by one for prevent outh of memory error
results = []
while True:
row = c.fetchone()
if row == None:
break
results.append(row)
print "Fetched {0} records from DB.".format(str(len(results)))
c.close()
db.close()
- В первом случае я использую SSCursor (cursorclass =
MySQLdb.cursors.SSCursor) и использует только 650 МБ оперативной памяти.
- Во втором случае я использую SSDictCursor (cursorclass =
MySQLdb.cursors.SSDictCursor) и использует более 2,5 ГБ ОЗУ.