python - 太多的写操作

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

我正在应用程序引擎(python)上开发一个目录应用程序,但我遇到了太多写入操作的麻烦。第一个问题是我有一个 .NET 脚本,它会遍历 Excel 文件并将数据发布到我的应用程序中的页面。当我运行它时,它处理了大约 700 条记录,并且我已经使用了 75% 的写入操作配额。当我编写一个脚本来更新所有模型以使每个属性都有一个搜索字段时,也发生了同样的事情。我在大约 20 秒内从配额的 75% 填充到了 96%,并且在短时间内进行了过多的写入操作,我得到了临时配额限制。我认为这个问题可能与索引有关,但当涉及到 python 和 appengine 时,我有点新手。这是我的模型:

class AlumniEntry(db.Model):
    """Models an entry for a single alumni"""
    author = db.UserProperty()
    entered = db.DateTimeProperty(auto_now_add=True)
    title = db.StringProperty()
    first_name = db.StringProperty(required=True)
    first_name_search = db.StringProperty()
    maiden_name = db.StringProperty()
    maiden_name_search = db.StringProperty()
    spouse_name = db.StringProperty()
    spouse_name_search = db.StringProperty()
    grad_year = db.StringProperty(required=True)
    elementary = db.StringProperty(choices=('yes', 'no', 'idk'), default='idk')

class LastName(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='last_names')
    last_name = db.StringProperty(required=True)
    last_name_search = db.StringProperty()

class PhoneNumber(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='phone_numbers')
    number = db.PhoneNumberProperty(default=None)

class Email(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='emails')
    email = db.EmailProperty(default=None)
    email_search = db.EmailProperty(default=None)

class Address(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='addresses')
    street = db.StringProperty()
    street_search = db.StringProperty()
    city = db.StringProperty()
    city_search = db.StringProperty()
    state = db.StringProperty()
    state_search = db.StringProperty()
    zip_code = db.StringProperty()

class UserAuth(db.Model):
    added_by = db.StringProperty(required=True)
    user_id = db.StringProperty(required=True)

最佳答案

除非您在搜索中定位某个属性(或将其用于排序),否则使它们未建立索引可以保存索引写入。每个属性都会被索引两次(一次升序,一次降序),除非该属性类型本质上未索引,或者您设置了 indexed=False

参见http://code.google.com/appengine/docs/python/datastore/propertyclass.html#Property

在您的情况下,如果 street_search 是用于搜索的 street 的标准化形式,则将 street 标记为 indexed=False 将节省 2 次写入。

关于python - 太多的写操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683035/

相关文章:

ios - 使用服务帐户从 iOS 应用上传到 Google Cloud Storage

java - 如何在GAE java中为自定义用户数据库创建cookie?

Python 函数告诉我当我只发送一个参数时我发送了两个参数

python - 如何在 appengine 之外使用 ndb?

java - 如果实体的祖先不存在,是否会创建它(Java API)?

google-app-engine - 谷歌数据存储全局连接

python - 将图像从 StringIO 存储到文件会创建扭曲的图像

python - 如何最大化正则表达式非贪婪向后工作

javascript - 创建 JSON 对象的排列?

python - PyPy——它怎么可能打败 CPython?