Импортируйте большой кусок данных в Google App Engine Data Store за один раз - PullRequest
3 голосов
/ 10 июля 2010

У меня большой CSV-файл, размером около 10 МБ, который содержит все данные, которые необходимо импортировать в хранилище данных Google App Engine. Я попробовал следующие подходы, чтобы выполнить импорт, но все время это не удавалось на полпути.

  • Импорт с использованием сопоставления команды с URL-адресом и последующего выполнения URL-адреса завершился неудачно из-за истечения времени ожидания запроса ...
  • Импорт с использованием создания задания cron, но получил DeadlineExceededError ...
  • Импорт с использованием remort_api_shell, но время операции истекло.

Не могли бы вы подсказать мне и подойти (используя фиктивные данные, которые вы можете себе представить), как это сделать ... Предложение с кодом будет более полезным.

** Я использую Python и каркас веб-приложения Google для разработки указанного приложения.

1 Ответ

4 голосов
/ 10 июля 2010

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

http://code.google.com/appengine/docs/python/tools/uploadingdata.html

это хорошая статья.

и вот мой contactloader.py, который я использовал 2 года назад для справки.это более изощренно, так как в прошлый раз я использовал, но все же .....

import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader

class Contact(db.Model):

    date = db.DateTimeProperty(auto_now_add=True)

    owner = db.StringProperty()

    companyname = db.StringProperty()

    companyemail = db.EmailProperty()

def myfunc(x):
    temp = x.split(":mailto:")
    if len(temp) > 0:
        temp = temp[-1].split(":")
    else:
        return "defaultvalue"
    if len(temp) > 0:
        temp = temp[0]
    else:
        return "defaultvalue"
    temp = temp.split("<1>")[0]
    if temp is None or len(temp) < 5:
        return "defaultvalue"
    return temp

def mysecfunc(x):
    return x.split("<0>")[0]

class ContactLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Contact',
                                   [
                                    ('companyname',mysecfunc),
                                    ('owner', lambda x:"somevalue"),
                                    ('companyemail',myfunc),
                                    ("date",lambda x:datetime.datetime.now()),
                                   ])

loaders = [ContactLoader]
...