当前位置: 首页 > 知识库问答 >
问题:

Google应用程序引擎和Google工作表超出软内存限制

林涵映
2023-03-14

我正在编写一个简单的服务,从多个来源获取数据,将其存储在一起,然后使用GoogleAPI客户端将其发送到GoogleSheet。Easy peasy很好用,数据没有那么大。

问题是,在构建api服务(即build('床单','v4',超文本传输协议=auth)后调用. spread表()会导致大约30兆字节的内存跳跃(我做了一些分析来分离内存在哪里正在分配)。当部署到GAE时,这些尖峰会持续很长一段时间(有时一次持续几个小时),向上蔓延,并在几次请求后触发GAE的“超过软私有内存限制”错误。

我使用memcache来获取发现文档,使用urlfetch来获取数据,但这是我唯一使用的其他服务。

我尝试过手动垃圾收集,在应用程序中更改threadsafe。yaml,甚至像改变点这样的事情。电子表格()被调用,无法解决此问题。也有可能我只是对GAE的架构有一些误解,但我知道这个峰值是由调用GAE引起的。电子表格(),我没有在本地缓存中存储任何内容。

有没有一种方法可以1)减少调用内存峰值的大小。电子表格()或2)防止峰值停留在内存中(或者最好两者都做)。下面是一个非常简单的要点,让我们了解API调用和请求处理程序,如果需要,我可以提供更完整的代码。我知道以前也有人问过类似的问题,但我无法解决。

https://gist.github.com/chill17/18f1caa897e6a20201232165aca05239


共有1个答案

壤驷泓
2023-03-14

我在一个只有20MB可用RAM的小型处理器上使用电子表格API时遇到了这个问题。问题是GoogleAPI客户端以字符串格式拉入整个API,并将其作为资源对象存储在内存中。

如果存在空闲内存问题,您应该构建自己的超文本传输协议对象,并手动发出所需的请求。请参阅我的电子表格()类,作为如何使用此方法创建新电子表格的示例。

SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Sheets API Python Quickstart'

class Spreadsheet:

    def __init__(self, title):

        #Get credentials from locally stored JSON file
        #If file does not exist, create it
        self.credentials = self.getCredentials()

        #HTTP service that will be used to push/pull data

        self.service = httplib2.Http()
        self.service = self.credentials.authorize(self.service)
        self.headers = {'content-type': 'application/json', 'accept-encoding': 'gzip, deflate', 'accept': 'application/json', 'user-agent': 'google-api-python-client/1.6.2 (gzip)'}        


        print("CREDENTIALS: "+str(self.credentials))


        self.baseUrl = "https://sheets.googleapis.com/v4/spreadsheets"
        self.spreadsheetInfo = self.create(title)   
        self.spreadsheetId = self.spreadsheetInfo['spreadsheetId']    



    def getCredentials(self):
        """Gets valid user credentials from storage.

        If nothing has been stored, or if the stored credentials are invalid,
        the OAuth2 flow is completed to obtain the new credentials.

        Returns:
            Credentials, the obtained credential.
        """
        home_dir = os.path.expanduser('~')
        credential_dir = os.path.join(home_dir, '.credentials')
        if not os.path.exists(credential_dir):
            os.makedirs(credential_dir)
        credential_path = os.path.join(credential_dir,
                                       'sheets.googleapis.com-python-quickstart.json')

        store = Storage(credential_path)
        credentials = store.get()
        if not credentials or credentials.invalid:
            flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
            flow.user_agent = APPLICATION_NAME
            if flags:
                credentials = tools.run_flow(flow, store, flags)
            else: # Needed only for compatibility with Python 2.6
                credentials = tools.run(flow, store)
            print('Storing credentials to ' + credential_path)
        return credentials

    def create(self, title):

        #Only put title in request body... We don't need anything else for now
        requestBody = {
            "properties":{
                "title":title
            },
        }


        print("BODY: "+str(requestBody))
        url = self.baseUrl

        response, content = self.service.request(url, 
                                        method="POST", 
                                        headers=self.headers,
                                        body=str(requestBody))
        print("\n\nRESPONSE\n"+str(response))
        print("\n\nCONTENT\n"+str(content))

        return json.loads(content)
 类似资料:
  • 我们在谷歌应用引擎(GAE)上有一个长期运行的服务。然而,过了一会儿,我们开始得到图像中的错误。代码没有变化。我不明白为什么我们会有以前没有的问题。 2020-01-05 08:31:32.704UTC-8在总共服务0个请求后,超过了2048 MB的软内存限制(2068 MB)。考虑在app.yaml.中设置一个更大的实例类 2020-01-05 08:31:32.705UTC-8此请求导致为应用

  • 在python上的GoogleAppEngine中,我遇到了以下错误:在服务了总共2个请求后,超过了128 MB的软私有内存限制,达到了157 MB。我尝试使用以下命令来解决这个问题。上下文=ndb。获取上下文()和上下文。设置缓存策略(False)。我把这个方法放在appengine\u配置中。py,也在应该处理请求的处理程序中。我想知道是否还有其他地方可以放置这个命令,或者我是否应该总共使用一

  • 有人知道我们如何使用超过12个并发连接从App Engine到Cloud SQL吗? 我们发现留档说:“在标准环境中运行的每个App Engine实例与Google CloudSQL实例的并发连接不能超过12个。” 我们正在使用 Java for App Engine 使用 Hibernate...连接池指出它不应该在生产环境中使用,但如果我们禁用池,我们将达到最大连接数。

  • 嗨,我正在开发IOS应用程序。我还使用JSON web服务。我还使用Google App Engine for python。我对python和google应用程序引擎真的是个新手。我想不出这个问题; 我在json中发送bas64图像和其他信息。我想保存其他信息到数据库(GQL),并保存到图像谷歌文件夹(Blob商店),这张照片网址保存在谷歌数据库的其他信息。 你能帮帮我吗 更新

  • 我对部署在Google云应用程序引擎中的Spring Boot应用程序有问题。该应用程序是一个使用JPA和JWT的API,并连接到存储在Google Cloud SQL中的MySQL数据库。 问题是应用程序由于内存限制而被卡住。每次请求后,我都会在日志中看到以下消息: 在总共为0个请求提供服务后,超过了256 MB的软内存限制,为298 MB。考虑在App中设置更大的实例类。亚马尔 此请求导致为应

  • 我正在将一个非常基本的web应用程序部署到Google应用程序引擎。我使用的是Springboot,我可以在本地很好地运行应用程序,但当我部署到Google时,应用程序引擎不会启动实例。我在启动时配置了一个云SQL数据源。 我有云sql配置属性配置src/main/Resources/application.properties.App Engine似乎找不到这些属性,所以它无法正确设置Cloud