如何减少 Python Heroku 应用程序的内存使用量?

问题描述

我正在为 GroupMe 开发一个聊天机器人作为一个个人项目,它将能够在出现提示时报告聊天统计信息(除其他外)。到目前为止,它在简单的事情上运行良好(触发响应、连接到 Postgres DB、连接到 S3 Bucket),但我遇到了内存问题。错误信息如下所示:

2020-12-31T00:41:29.739211+00:00 heroku[web.1]: Process running mem=1020M(199.3%)
2020-12-31T00:41:29.741378+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2020-12-31T00:41:31.891488+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/" host=[my app name].herokuapp.com request_id=aec774e5-3e59-44dd-ab32-fca6bc97bc32 fwd="[an IP address]" dyno=web.1 connect=0ms service=30001ms status=503 bytes=0 protocol=https

虽然进程运行内存并不总是一样的。我见过错误率低至 128% 和高达 200%。

这里是代码耗尽内存的函数

def get_full_chat(self,file_type='pickle',time_convert=False):
        app._log('fetching chat')
        s3 = self.s3
        obj = s3.Object(S3_OBJ_NAME,f'full_text.{file_type}')
        if file_type == 'pickle':
            df = pd.read_pickle(io.BytesIO(obj.get()['Body'].read()),compression='zip')
        elif file_type == 'json':
            df = pd.read_json(io.BytesIO(obj.get()['Body'].read()),convert_dates=False,convert_axes=False)
        else :
            raise Exception('Unsupported extension')
        if time_convert:
             df['created_at'] = pd.to_datetime(df['created_at'],unit='ms')
             df.sort_values(by='created_at',inplace=True)
        df.index.name = 'id'
        app._log('returning chat')
        return df

Heroku 的免费服务有 512MB 的内存,但是pickled 的文件只有 31MB,未压缩的 JSON 不到 300MB。对于我设置的所有分析工作(当时使用本地可用数据集)来说,此函数返回一个包含完整聊天历史记录的 Pandas 数据框很重要。这不可能吗?我在想 Pandas 数据框可能是比 JSON 更大的对象,这就是为什么我远远超出上限的原因。有没有办法减少内存使用?

因此,如果我不得不接受失败并且不可能在如此大的 DataFrame 上工作,有没有人对如何将我的分析调整为分段块提出建议?最有效的方法是将数据分成 2-4 个文件并一次读取/使用那些文件,然后合并结果?在此过程中,我将如何降低内存使用率?

一个可能相关的旁注,有没有办法让数据帧对象持久化,这样每次用户发出相关命令时就不必从 S3 检索它并由 Pandas 加载?我认为这可能会减少内存使用。

有关如何进行的任何指导将不胜感激。我的项目有点碰壁了。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...