在AWS EC2运行Docker镜像出现MemoryError问题求助
AWS EC2 Docker镜像运行时解析RDF图出现MemoryError问题
环境与配置
Dockerfile内容
FROM pytorch/pytorch:latest WORKDIR /workspace RUN apt-get update \ && apt-get install -y coreutils \ && apt-get install -y findutils \ && apt-get install -y wget \ && apt-get install -y python3 \ && apt-get install -y python3-pip \ && apt-get install -y tar COPY requirements.txt /workspace/requirements.txt RUN pip install --upgrade pip \ && pip install --no-cache-dir -r requirements.txt RUN wget https://dl.fbaipublicfiles.com/fairseq/models/roberta.large.tar.gz RUN tar -xzvf roberta.large.tar.gz COPY work /workspace/work COPY pipeline /workspace/pipeline COPY scripts /workspace/scripts COPY resources /workspace/resources ENTRYPOINT ["/workspace/scripts/run_all_22.sh"]
错误栈信息
Traceback (most recent call last): File "/opt/conda/lib/python3.9/runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "/opt/conda/lib/python3.9/runpy.py", line 87, in _run_code exec(code, run_globals) File "/pipeline/preprocessing/preprocess_claims_relativepath.py", line 226, in <module> main() File "/pipeline/preprocessing/preprocess_claims_relativepath.py", line 215, in main claims = parse_aifdocs(root, args.aif_path, doc_out_json_dir) File "/pipeline/preprocessing/preprocess_claims_relativepath.py", line 34, in parse_aifdocs aif_graph.build_graph(str(inpath), fmt = "ttl") File "/aif/rdf_graph.py", line 174, in build_graph graph.parse(graph_path, format=fmt) File "/opt/conda/lib/python3.9/site-packages/rdflib/graph.py", line 1330, in parse parser.parse(source, self, **args) File "/opt/conda/lib/python3.9/site-packages/rdflib/plugins/parsers/notation3.py", line 1943, in parse p.loadStream(stream) File "/opt/conda/lib/python3.9/site-packages/rdflib/plugins/parsers/notation3.py", line 454, in loadStream return self.loadBuf(stream.read()) # Not ideal File "/opt/conda/lib/python3.9/site-packages/rdflib/plugins/parsers/notation3.py", line 460, in loadBuf self.feed(buf) File "/opt/conda/lib/python3.9/site-packages/rdflib/plugins/parsers/notation3.py", line 473, in feed s = octets.decode("utf-8") MemoryError
用户尝试过指定Docker内存交换但无效,怀疑Docker环境存在64位系统装32位Python的情况。
问题原因分析与解决建议
1. EC2实例内存资源不足(最可能)
错误栈显示stream.read()会一次性将整个TTL文件读入内存,若文件体积较大,EC2实例的内存规格不足以支撑该操作,而本地机器内存足够所以运行正常。
- 解决方法:
- 升级EC2实例内存规格,比如从
t2.micro切换到t2.large或更高配置; - 修改rdflib解析逻辑,避免一次性读取全量文件:将
graph.parse(graph_path, format=fmt)改为逐行读取解析,示例代码:
注意:需确保TTL文件的行结构符合解析要求,复杂语句可能需要调整拆分逻辑。with open(graph_path, 'rb') as f: for line in f: graph.parse(data=line, format=fmt)
- 升级EC2实例内存规格,比如从
2. 检查Docker环境的Python位数
pytorch/pytorch:latest默认是64位镜像,但Dockerfile中额外安装了系统python3,可能存在版本冲突或安装了32位Python的情况(32位Python最大仅能寻址约4GB内存)。
验证命令:
docker exec -it <container_id> python3 -c "import sys; print(sys.maxsize > 2**32)"输出
False则说明是32位Python。解决方法:
- 删除Dockerfile中
apt-get install -y python3 python3-pip两行,直接使用基础镜像自带的conda环境Python,避免版本冲突; - 若必须使用系统Python,通过
dpkg --print-architecture确认系统架构为amd64,确保安装的是64位Python。
- 删除Dockerfile中
3. Docker内存限制未正确配置
即使设置了swap,若Docker本身限制了容器内存,依然会导致内存不足。
验证方式:
docker inspect <container_id> | grep -A 5 "Memory"查看
Memory和MemorySwap参数,MemorySwap设为-1表示不限制swap。解决方法:
运行容器时显式指定内存配额:docker run --memory=8g --memory-swap=-1 <your_image>根据EC2实例实际内存调整
--memory参数。
4. 其他进程占用过多内存
RoBERTa模型加载等操作可能已占用大量内存,导致解析RDF时内存不足。
验证方式:
容器运行时执行:docker exec -it <container_id> top查看内存占用最高的进程。
解决方法:
- 优化模型加载方式,比如使用模型量化减少内存占用;
- 清理容器内不必要的进程,释放内存资源。
内容的提问来源于stack exchange,提问作者YQQQ
相关产品推荐
相关产品推荐

