一次性将大量数据导入Google App Engine数据存储

时间:2010-07-10 07:03:59

标签: python google-app-engine google-cloud-datastore

我有一个大的CSV文件,大小约为10 MB,其中包含需要在Google App Engine DataStore中导入的所有数据。 我尝试了以下方法来执行导入,但所有时间都失败了一半。

  • 使用将命令映射到url然后执行url导入,因请求超时而失败...
  • 使用创建cron作业导入,但获得DeadlineExceededError ...
  • 使用remort_api_shell导入,但操作已超时。

你能建议我和approch(使用你能想象的虚拟数据)怎么做...用代码建议会更有帮助..

**我正在使用Python和谷歌的网络应用程序框架开发上述应用程序。

1 个答案:

答案 0 :(得分:4)

你可以逐行发布。使用内置的批量加载器。

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

这是好文章。

这是我2年前用过的contactloader.py供参考。自从上次使用以来它更复杂但仍然.......

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]