Есть ли способ заставить django remote api работать быстрее в GAE? - PullRequest
1 голос
/ 29 июня 2011

После этого вопроса здесь .

Я наконец-то написал инструмент для генерации кода, чтобы обернуть все данные моей базы в что-то вроде этого:

Pdtfaamt(fano=212373,comsname='SMM',pdtcode='20PLFCL',kind='1',fatype='S',itemno='A3',itemamt=75,type=0).save()
Pdtfaamt(fano=212374,comsname='SMM',pdtcode='20PLFCL',kind='1',fatype='S',itemno='E1',itemamt=75,type=0).save()
Pdtfaamt(fano=212375,comsname='SMM',pdtcode='20PLFCL',kind='1',fatype='S',itemno='E6',itemamt=75,type=0).save()
Pdtfaamt(fano=212376,comsname='SMM',pdtcode='20PLFCL',kind='1',fatype='C',itemno='A3',itemamt=3,type=1).save()

Да, верно! Я вытащил всю базу данных и преобразовал данные в коды инструкций по заполнению, чтобы я мог перенести свою базу данных в GAE.

Поэтому я развернул проект django-nonrel и использовал удаленный API django-nonrel для запуска процесса заполнения данных.

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

пс. Я использую django-nonrel и djangoappengine для бэкэнда.

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Напишите свой скрипт импорта, чтобы воспользоваться преимуществами многопроцессорного пула Python

def import_thing(data):
    thing = ThingEntity(**data)
    thing.put()

def main():
    data = [{fano:'212374', comsname:'SMM', },
              {fano:'212374', comsname:'212375', },
              ...etc ]
    pool = multiprocessing.Pool(4) # split data into 4 parts to run in parallel
    pool.map(import_thing, data)

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

Также важно : убедитесь, что вы кладете их, скажем, по 10-20 партий, не по одной за раз, иначе круговые поездки будут убивать вашу производительность. Таким образом, улучшенный сценарий должен работать такими частями, как:

data = [
    [item1,item2,item3],
    [item4, item5, item6],
    [item7, item8, item9],
]
pool.map(import_batch, data)
1 голос
/ 29 июня 2011

Возможно, вы захотите взглянуть на Mapper API .

...