使用PostgreSQL的DevPi无法上传大文件问题求助
解决DevPi+PostgreSQL上传大文件内存溢出问题
问题重现
上传约1350MB文件时触发PostgreSQL内存错误:
pg8000.exceptions.DatabaseError: {'S': 'ERROR', 'V': 'ERROR', 'C': '54000', 'M': 'out of memory', 'D': 'Cannot enlarge string buffer containing 0 bytes by 1391196735 more bytes.', 'W': 'COPY files, line 1, column data', 'F': 'stringinfo.c', 'L': '303', 'R': 'enlargeStringInfo'}
已尝试--max-request-body-size和调大max_wal_size无效,环境为Python脚本+twine上传、PostgreSQL 16.2、DevPi自动生成表结构。
解决方案
1. 切换DevPi存储模式到文件系统(推荐)
DevPi默认将文件内容存在PostgreSQL字段中,大文件会直接触发数据库内存溢出。改为文件系统存储可彻底规避该问题:
- 停止当前DevPi服务
- 重新启动时添加
--storage fs参数并指定数据存储目录:devpi-server --storage fs --serverdir /your/devpi/storage/path - 若使用配置文件,在配置中添加:
[server] storage = fs
2. 调整PostgreSQL内存参数(仅当必须使用数据库存储时)
错误源于PostgreSQL执行COPY操作时,无法分配足够内存加载大文件内容,需调整以下核心参数:
- 编辑
postgresql.conf配置文件:# 根据服务器内存调整,建议设为64MB~256MB work_mem = 64MB # 维护操作内存,可设为256MB~1GB maintenance_work_mem = 256MB # 共享缓冲区,建议设为物理内存的1/4 shared_buffers = 4GB - 重启PostgreSQL服务使配置生效:
# 以systemd管理为例 sudo systemctl restart postgresql
3. 验证DevPi表结构(可选)
检查DevPi自动生成的files表,若data字段类型为bytea,大文件写入时会持续占用内存。若坚持用数据库存储,可考虑将文件拆分为多个小片段存储,但此方法需修改DevPi源码,不推荐。
内容的提问来源于stack exchange,提问作者ssuh
相关产品推荐
相关产品推荐

