0

由于数据存储对引用的实体进行额外查询,我的应用程序出现延迟问题。我收到了关于如何使用 get_value_for_datastore() 函数处理单值属性的好建议。但是我的应用程序也有一对多的关系,如下面的代码所示,我还没有找到预取这些实体的方法。结果是在尝试显示包含 200 个文档及其相关文档文件的表格时出现不可接受的延迟 (>6000ms)。

(可能永远不会超过 10.000 个文档或 DocumentFiles)

有没有办法解决这个问题?

模型.py

class Document(db.Expando):
    title = db.StringProperty()
    lastEditedBy = db.ReferenceProperty(DocUser, collection_name = 'documentLastEditedBy')  
...

class DocUser(db.Model):
    user = db.UserProperty()
    name = db.StringProperty()  
    hasWriteAccess= db.BooleanProperty(default = False)
    isAdmin = db.BooleanProperty(default = False)
    accessGroups = db.ListProperty(db.Key)
...

class DocumentFile(db.Model):
    description= db.StringProperty()
    blob = blobstore.BlobReferenceProperty()
    created = db.DateTimeProperty() # needs to be stored here in relation to upload / download of everything    
    document = db.ReferenceProperty(Document, collection_name = 'files')

    @property
    def link(self):     
        return '<a href="/file/serve/%s">%s</a>' % (self.key().id(),self.blob.filename) 
...

主文件

docUsers = DocUser.all()
docUsersNameDict = dict([(i.key(), i.name) for i in docUsers])

documents = Document.all()
for d idocuments:        
    out += '<td>%s</td>' % d.title    
    docUserKey = Document.lastEditedBy.get_value_for_datastore(d)
    out +='<td>%s</td>' % docUsersNameDict.get(docUserKey)
    out += '<td>'                           
    # Creates a new query for each document, resulting in unacceptable latency
    for file in d.files: 
        out +=  file.link + '<br>'
    out += '</td>'  
4

2 回答 2

2

将链接非规范化并存储在您的文档中,以便快速获取链接。

您需要注意,当您更新 DocumentFile 时,您需要更新关联的 Document。这是在您从数据存储中读取链接的频率远高于更新链接的假设下运行的。

非规范化通常是 App Engine 性能不佳的解决方法。

于 2012-04-30T15:32:14.670 回答
1

异步加载文件。在 d.files 上使用 get_value_for_datastore,它应该返回一个键的集合,然后你可以执行 db.get_async(key) 来返回一个未来的对象。您将无法像您所做的那样以程序方式写出您的结果,但是为所有文档组装一个部分请求/字典应该是微不足道的,其中包含待处理的未来 get() 集合,然后当您进行迭代时构建结果,您可以最终确定期货,这将在不阻塞 {~0ms 延迟}的情况下完成。

基本上,您需要两次迭代。第一次迭代将通过并异步请求您需要的文件,第二次迭代将通过,最终确定您的获取并构建您的响应。

https://developers.google.com/appengine/docs/python/datastore/async

于 2012-04-30T15:43:25.117 回答