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

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

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

  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 ГБ ОЗУ.
...