问题描述
我正在为 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 (将#修改为@)