python - 在电报机器人中发送一些照片时出现内存错误
问题描述
我创建了一个电报机器人,它会向用户发送一些照片。它在 4 或 5 张照片中效果很好,但之后它就崩溃了。我发送这样的照片:
for i in range(len(pages)):
photo = open('pics/{0}.jpg'.format(i+1), 'rb')
bot.send_photo(chat_id=chat_id,photo=photo)
这是我的错误:
2019-03-13 14:30:52,207 (util.py:65 WorkerThread2) ERROR - TeleBot: "MemoryError occurred, args=()
Traceback (most recent call last):
File "/root/Env/pdf/lib/python3.5/site-packages/telebot/util.py", line 59, in run
task(*args, **kwargs)
File "pdf.py", line 63, in handle_docs
pages = convert_from_path('botpdf.pdf', 500)
File "/root/Env/pdf/lib/python3.5/site-packages/pdf2image/pdf2image.py", line 98, in convert_from_path
data, err = proc.communicate()
File "/usr/lib/python3.5/subprocess.py", line 1072, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "/usr/lib/python3.5/subprocess.py", line 1745, in _communicate
stdout = b''.join(stdout)
MemoryError
"
Traceback (most recent call last):
File "pdf.py", line 99, in <module>
bot.polling(none_stop=False, interval=0)
File "/root/Env/pdf/lib/python3.5/site-packages/telebot/__init__.py", line 389, in polling
self.__threaded_polling(none_stop, interval, timeout)
File "/root/Env/pdf/lib/python3.5/site-packages/telebot/__init__.py", line 413, in __threaded_polling
self.worker_pool.raise_exceptions()
File "/root/Env/pdf/lib/python3.5/site-packages/telebot/util.py", line 108, in raise_exceptions
six.reraise(self.exc_info[0], self.exc_info[1], self.exc_info[2])
File "/root/Env/pdf/lib/python3.5/site-packages/six.py", line 693, in reraise
raise value
File "/root/Env/pdf/lib/python3.5/site-packages/telebot/util.py", line 59, in run
task(*args, **kwargs)
File "pdf.py", line 63, in handle_docs
pages = convert_from_path('botpdf.pdf', 500)
File "/root/Env/pdf/lib/python3.5/site-packages/pdf2image/pdf2image.py", line 98, in convert_from_path
data, err = proc.communicate()
File "/usr/lib/python3.5/subprocess.py", line 1072, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "/usr/lib/python3.5/subprocess.py", line 1745, in _communicate
stdout = b''.join(stdout)
MemoryError
解决方案
使用输出目录,您当前的使用情况会pdf2image
加载内存中的所有图像。这可能会产生巨大的影响!
你写的地方pages = convert_from_path('botpdf.pdf', 500)
将其更改为:
import tempfile
with tempfile.TemporaryDirectory() as path:
pages = convert_from_path('botpdf.pdf', 500, output_folder=path)
这会将所有转换后的图像写入磁盘,然后再将它们返回给您(节省大量内存)。您还可以转换为 JPEG 而不是默认的 PPM(这是一种原始格式):
pages = convert_from_path('botpdf.pdf', 500, fmt='jpeg')
但是,如果 PDF 非常大,使用此解决方案您仍然会遇到问题。
推荐阅读
- python - 更新列标题时允许重复列熊猫/刷新列dtypes
- c - PostgreSQL/PostGIS - PQexecParams - 错误的元素类型
- docker - 使用主机名而不是 localhost 访问 docker 容器
- shiny - 如何让 Shiny setInputValue 更改下拉选择?
- java - 我的伪 3D 程序正在绘制一个点而不是一条线
- if-statement - 为什么这个程序不给我两个变量的总和
- ada - 当 Vector 包含字符串时,“Element_Type”的实际 Ada 错误必须是明确的子类型
- javascript - 在javascript中获取UTC日期(不是UTC字符串)
- c - 为什么当我在“if”语句后添加“else”时,代码无法正常运行?
- python - crontab 启动脚本运行但没有任何反应