Заполните хранилище данных приложения Google App Engine 20 000 строк - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь создать и сохранить 20000 случайных кодов в моем локальном хранилище данных, прежде чем попробовать это в appspot ... Это модель

class PromotionCode (db.Model):
  code = db.StringProperty(required=True)

И это класс, который обрабатывает заполненный запрос (его может использовать только зарегистрированный администратор). Он создает случайные буквенно-цифровые коды и пытается сохранить 20000 из них в хранилище данных:

class Populate(webapp.RequestHandler):

  def GenerateCode(self):
    chars = string.letters + string.digits
    code = ""
    for i in range(8):
      code = code + choice(chars)
    return code.upper()

  def get(self):
    codes = "";
    code_list = []
    for i in range(20000):
      new_code = self.GenerateCode()
      promotion_code = PromotionCode(code=new_code)
      code_list.append(promotion_code)
      codes = codes + "<br>" + new_code
    db.put(code_list)
    self.response.out.write("populating datastore...<br>")
    self.response.out.write(codes)

Я подумал, что могу попробовать пакетную обработку всех этих методов (), поэтому я создал список кодов (code_list). Это займет 2-5 минут, чтобы сделать это локально.

Можно ли сделать это быстрее, не используя параметр bulkuploader? Потому что я получаю 500 ошибок сервера, очевидно. Или, может быть, делать это в последовательных звонках или шагах ...

Ответы [ 4 ]

1 голос
/ 20 октября 2011

Почему бы просто не изменить свой код выше, чтобы вставить 100 за раз, и просто запустить что-то вроде:

for i in {1..200}
  do
    curl --cookie "ACSID=your-acsid-cookie" http://your-app-id.appspot.com/populatepath
    sleep(5)
  done

из командной строки?В любом случае, записи являются случайными, вам не нужно запоминать состояние.

Вы можете получить файл cookie ACSID, выполнив вход вручную и проверив файлы cookie в своем браузере.

Спящий режим между запросами не позволит вам набрать гигантское количество экземпляров или набрать кратковременныйквоты.

Предложение очереди задач хорошо, если это то, что вам нужно автоматизировать, но если это разовая вещь, вы могли бы также упростить ее.

0 голосов
/ 25 октября 2011

Если ваша задача не будет выполнена в течение 30-секундного крайнего срока запроса, вы можете разбить ее на куски - что должно быть легко, поскольку все они делают одно и то же - и запустить их в задачах в очереди задач. В любом случае, вам, вероятно, следует выполнять всю свою работу там, поэтому вы не должны заставлять пользователя ждать его завершения, прежде чем возвращать ответ.

Как и Джефф, я озадачен, почему вы хотите генерировать 20 000 таких авансов, а не просто генерировать их, когда они вам нужны.

0 голосов
/ 22 октября 2011

Я не понимаю, почему вы должны создавать 20 000 заранее, а не создавать их по мере необходимости, но держу пари, что вы могли бы немного ускорить свой код.Примерно так (не проверено):

class Populate(webapp.RequestHandler):

  chars = "AB...Z01...9"

  def GenerateCode(self):
    return ''.join(choice(chars) for _ in xrange(8))

  def get(self):
    code_list = []
    for i in range(20000):
      new_code = self.GenerateCode()
      promotion_code = PromotionCode(code=new_code)
      code_list.append(promotion_code)
    db.put(code_list)
    self.response.out.write("populating datastore...<br>")
    self.response.out.write("done")

Не распечатка кодов может сэкономить время.

Я уверен, что другие здесь могут добиться большего успеха ...

0 голосов
/ 20 октября 2011

Можно ли пакетировать процесс в очереди задач.

Установка большого размера пакета в очередь задач ...

Вы можете архивировать это быстрее

...