Почему SSDictCursor использует до 2,5 ГБ ОЗУ, когда я пытаюсь извлечь 1,5 миллиона строк, а SSCursor использует всего 650 МБ ОЗУ?
Когда я пытаюсь извлечь 1,5 миллиона строк из таблицы MySQL с помощью сценария Python с MySQLdb, я получаю сообщение об ошибке "Out Of Memory" на моем сервере.
После отладки я получил эту информацию.
с 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 ГБ оперативной памяти.