Почему SSDictCursor использует до 2,5 ГБ ОЗУ, когда я пытаюсь извлечь 1,5 миллиона строк, а SSCursor использует всего 650 МБ ОЗУ?

Когда я пытаюсь извлечь 1,5 миллиона строк из таблицы MySQL с помощью сценария Python с MySQLdb, я получаю сообщение об ошибке "Out Of Memory" на моем сервере.

После отладки я получил эту информацию.

  1. с SSCoursor или курсором по умолчанию он использует только 650 МБ ОЗУ

  2. с 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()
  1. В первом случае я использую SSCursor (cursorclass = MySQLdb.cursors.SSCursor), и он использует только 650 МБ оперативной памяти.
  2. Во втором случае я использую SSDictCursor (cursorclass = MySQLdb.cursors.SSDictCursor), и он использует более 2,5 ГБ оперативной памяти.

0 ответов

Другие вопросы по тегам