当前位置: 首页 > article >正文

Spring Boot 做 RAG 文档上传:1GB 文件会不会打爆内存?

做 RAG 系统时文档上传很容易被低估。普通系统里上传文件可能只是保存附件。但在 RAG 里上传只是第一步后面通常还有上传文档 - 保存文件 - 解析文本 - 文本分片 - 生成 embedding - 写入向量库如果用户上传一个 1GB 的 PDF 或 Word 文档问题就变得很现实Spring Boot 会不会先把 1GB 文件全部读进内存如何配置拒绝策略1. 先说结论Spring Boot 已经提供了 multipart 上传大小限制。常见配置如下spring: servlet: multipart: max-file-size: 50MB max-request-size: 100MB这两个是 Spring Boot 官方参数。max-file-size限制单个文件大小。max-request-size限制整个 multipart 请求大小包括文件和普通表单字段。重点是Spring Boot 不会为了判断 1GB 文件是否超限就先把 1GB 全部读进 JVM 堆内存。在常规 Spring MVC 上传里文件大小限制会在 multipart 解析阶段生效。很多情况下Controller 方法还没进入请求就已经因为超限失败了。例如一个普通上传接口PostMapping(value /documents/upload, consumes MediaType.MULTIPART_FORM_DATA_VALUE) public void upload(RequestPart(file) MultipartFile file) { documentService.upload(file); }这里的MultipartFile不等于文件内容已经完整在内存里。它只是业务代码访问上传文件的入口。真正影响内存的是后面怎么用它。不推荐byte[] bytes file.getBytes();推荐try (InputStream inputStream file.getInputStream()) { fileStorage.save(inputStream, file.getOriginalFilename(), file.getSize()); }简单说Spring Boot 能限制上传大小。 但业务代码自己全量读取文件仍然会造成内存压力。2. Spring Boot 上传文件的大致流程文件上传一般是multipart/form-data请求。请求头里通常会带上Content-LengthPOST /documents/upload HTTP/1.1 Content-Type: multipart/form-data; boundary----WebKitFormBoundary Content-Length: 1073741824这个Content-Length表示请求体大小。服务端在读取完整文件之前就能先知道这次请求大概有多大。整体流程可以简单理解为客户端上传文件 | v Servlet 容器接收请求 | v Spring Boot / Servlet 解析 multipart | v 检查 max-file-size / max-request-size | v 没超限生成 MultipartFile 给 Controller 超限抛出上传大小异常所以它不是先完整读入内存 - 再判断大小而是解析过程中检查限制 文件内容通过缓冲区和临时文件处理 业务代码拿到 MultipartFile 后再决定怎么读取如果希望返回更友好的错误信息可以统一处理上传超限异常RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(MaxUploadSizeExceededException.class) public ResultVoid handleUploadSizeExceeded() { return Result.fail(上传文件大小超过限制); } }3. 真正容易出问题的地方Spring Boot 的 multipart 配置解决的是上传入口问题。但它不会替业务代码兜底。最常见的问题是全量读文件byte[] bytes file.getBytes();或者byte[] bytes inputStream.readAllBytes();这些代码会把文件完整读进 JVM 堆内存。如果文件是 50MB并发 10 个请求仅这一步就可能带来几百 MB 的内存压力。RAG 系统还要注意另一个点上传阶段和解析阶段不是一回事。上传阶段可以是流式的try (InputStream inputStream file.getInputStream()) { fileStorage.save(inputStream, file.getOriginalFilename(), file.getSize()); }但后续解析阶段可能又全量读了文件try (InputStream inputStream fileStorage.openStream(fileUrl)) { byte[] bytes inputStream.readAllBytes(); ParseResult result parser.parse(bytes); }这种情况下上传接口本身可能没问题但解析任务仍然可能造成内存波动。分片阶段也一样。很多代码会先拿到完整文本String text parser.extractText(inputStream); ListDocumentChunk chunks chunker.split(text);如果文档很大完整文本和分片列表都会占用内存。所以 RAG 文件链路不能只看上传接口还要看上传是否流式 解析是否全量读 分片是否一次性生成 embedding 是否批量过大 向量库写入是否有限流4. RAG 文件上传的建议第一后端必须配置上传大小限制。spring: servlet: multipart: max-file-size: 50MB max-request-size: 100MB前端可以提示文件大小但真正的限制一定要放在后端。第二上传阶段优先使用流。推荐try (InputStream inputStream file.getInputStream()) { fileStorage.save(inputStream, file.getOriginalFilename(), file.getSize()); }谨慎使用byte[] bytes file.getBytes();第三上传和解析最好解耦。上传接口只做校验文件 - 保存文件 - 创建文档记录 - 提交异步任务后续任务再做解析 - 分片 - embedding - 写入向量库第四上传并发要单独控制。max-file-size只限制单个文件大小max-request-size只限制单个请求大小它们不限制同时有多少人在上传。RAG 系统里并发上传会带来临时文件、磁盘 IO、解析任务、embedding 请求和向量库写入压力。第五解析和分片阶段也要控内存。可以考虑限制单个文档最大大小。限制解析文本最大长度。分片分批处理。embedding 分批提交。解析任务设置并发上限。总结一下1. Spring Boot 不会把超限文件全部加载到内存再拒绝而是有完善的早期拒绝机制 2. Content-Length 请求头让服务器在读取请求体之前就知道请求大小 3. Tomcat 在解析请求头时检查 Content-Length超过 maxSwallowSize默认 2MB直接拒绝不读取请求体 4. Spring Boot 在解析 multipart 请求时边读边检查文件大小超过 max-file-size 立即停止并抛出异常 5. 即使文件没超限Spring Boot 也不会把整个文件加载到内存而是边读边写到临时文件内存占用

相关文章:

Spring Boot 做 RAG 文档上传:1GB 文件会不会打爆内存?

做 RAG 系统时,文档上传很容易被低估。 普通系统里,上传文件可能只是保存附件。但在 RAG 里,上传只是第一步,后面通常还有: 上传文档 -> 保存文件 -> 解析文本 -> 文本分片 -> 生成 embedding -> 写入…...

无参考视频质量评估:AI如何在没有标准答案时评判视频画质

1. 项目概述:当AI成为视频的“质检员”在视频内容爆炸式增长的今天,我们每天都会接触到海量的视频流——从手机随手拍的短视频,到专业制作的影视剧,再到监控摄像头24小时不间断的记录。你有没有想过,这些视频的“画质”…...

HDLbits奇偶校验坑点复盘:我如何被Fsm serialdp“折磨”到发邮件问作者?

HDLbits奇偶校验坑点复盘:从状态机类型差异到调试方法论 凌晨三点,显示器上的波形依然和预期不符。这是我第七次重写Fsm serialdp的状态机代码,仿真结果中done信号始终在错误的时间点跳变。作为HDLbits的终极挑战之一,这道串口接收…...

用Arduino Uno和8个舵机,我让这个并联腿机器狗走起来了(附完整代码)

用Arduino Uno和8个舵机打造会走路的并联腿机器狗 第一次看到机器狗灵活地迈步时,那种成就感至今难忘。作为创客爱好者,我决定用最基础的Arduino Uno和8个舵机,从零开始搭建一个能自主行走的并联腿机器狗。这个项目不仅考验机械结构设计&…...

Linux常用命令合集:从新手到高手的核心操作指南

1. 项目概述:为什么我们需要一个“常用命令合集”?在Linux世界里摸爬滚打十几年,我见过太多新手,也包括一些从其他平台转过来的老手,面对黑漆漆的终端窗口时那种手足无措的茫然。Linux的强大,根植于其命令行…...

联网搜索会污染大模型判断吗?——面向日常开发场景的工程化分析

文章目录联网搜索会污染大模型判断吗?——面向日常开发场景的工程化分析结论1. 先区分三种“污染”1.1 不是权重污染,而是上下文污染1.2 检索污染:搜索结果不等于可信依据1.3 指令污染:外部内容可能改变模型行为2. 为什么日常开发…...

卡梅德生物技术快报|多肽库筛选技术构建药物递送功能肽库:流程、算法与质控体

1. 研究背景与问题提出在多肽药物递送系统开发中,功能肽的序列空间巨大,传统逐序列合成与测试方法通量低、成本高、周期长,无法覆盖构象多样性与体内复杂环境。纳米载体蛋白冠、亚细胞器定位困难、多肽稳定性不足等问题,亟需高通量…...

如何快速掌握JavaQuestPlayer:一站式QSP游戏开发与运行的终极指南

如何快速掌握JavaQuestPlayer:一站式QSP游戏开发与运行的终极指南 【免费下载链接】JavaQuestPlayer 项目地址: https://gitcode.com/gh_mirrors/ja/JavaQuestPlayer 还在为QSP游戏的兼容性和开发效率问题而烦恼吗?JavaQuestPlayer作为一款基于J…...

告别CentOS!Debian 11 + VMware 保姆级教程:搞定那些只支持国产系统的Linux客户端(以aTrust为例)

Debian 11 VMware 全栈解决方案:无缝运行国产Linux客户端软件 在开源世界的版图中,CentOS曾经是企业级Linux的代名词,但随着Red Hat战略调整和CentOS Stream的转型,许多传统解决方案正在面临前所未有的兼容性挑战。特别是在需要对…...

【头歌Educoder】国防科大 模板与 STL

第1关&#xff1a;初识模板函数任务目的本关目的&#xff1a;编写你的第一个模板函数。编程要求本题的要求为&#xff1a;编写模板函数 template <typename T, int n> int getIndex (T a[], T x)返回长度为 n 的数组 a 中 x 第一个出现的位置&#xff08;下标&#xff09…...

如何用四探针精确测量半导体电阻率

在半导体行业中&#xff0c;准确测量晶圆电阻率是材料研发和制程质量控制的关键环节。随着工艺节点不断缩小&#xff0c;器件对电性一致性的要求日益严格&#xff0c;仅靠经验无法满足现代制造的需求。因此工程师们大量采用四探针方法对电阻率进行高精度测量。相比传统测量方式…...

应对2026AIGC检测算法:5大热门降AI工具实测与免费提示词秘籍

为了找到真正靠谱的解决方案&#xff0c;我过去测试了市面上大部分号称能降低ai率的方法。从一分钱不花的模型指令&#xff0c;到各种付费的专业降ai率工具&#xff0c;用手头的文本做了几十次实操对比。说心里话&#xff0c;里面套路确实不少&#xff0c;有些方法用完后语句颠…...

收藏!小白程序员必看:如何抓住AI大模型时代红利?从入门到高薪就业全解析!

脉脉《2026春招职场洞察报告》显示&#xff0c;AI岗位量同比暴增8.7倍&#xff0c;AI科学家/负责人月薪破10万元&#xff0c;成为高薪职业断层领先者。新经济行业高薪岗位TOP20中&#xff0c;AI占据多数。字节跳动、大疆等大厂吸纳就业力强。文章建议考生关注AI相关新专业&…...

智慧工业控制面板工控部件元器件LCD部件检测数据集VOC+YOLO格式365张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;365标注数量(xml文件个数)&#xff1a;365标注数量(txt文件个数)&#xff1a;365标注类别数&…...

Python 浅拷贝与深拷贝:为什么我改了 b,a 也跟着变了?

Python 浅拷贝与深拷贝&#xff1a;为什么我改了 b&#xff0c;a 也跟着变了&#xff1f; 在 Python 中&#xff0c;列表、字典、集合这类对象都属于可变对象。 也正因为它们“可变”&#xff0c;所以在复制数据时&#xff0c;经常会遇到一个非常经典的问题&#xff1a;明明我改…...

智慧工业轮胎X光图像金属与结构缺陷检测数据集VOC+YOLO格式896张11类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;896标注数量(xml文件个数)&#xff1a;896标注数量(txt文件个数)&#xff1a;896标注类别数&…...

Microblaze软核处理器在SRAM型FPGA中的抗单粒子效应高可靠加固方案

1. 项目概述&#xff1a;为什么要在太空里“加固”一个软核处理器&#xff1f;在工业自动化、医疗影像或者汽车电子领域&#xff0c;你或许听说过Xilinx FPGA里的Microblaze软核处理器。它就像一个可以随心所欲“捏”出来的32位或64位CPU大脑&#xff0c;开发者能根据项目需求&…...

给企业主机穿上安全防护“黄金甲”,打造金城汤池

主机安全主要的风险来源——漏洞众所周知&#xff0c;软件是构成数字世界的基础&#xff0c;但是软件都是人为编写的&#xff0c;与一切皆可编程相对应的是&#xff0c;一切软件都存在漏洞。平均每千行代码就有4-6个安全缺陷&#xff0c;漏洞是网络安全的命门。但是&#xff0c…...

理光MP C2500扫描到共享文件夹保姆级教程(附Windows 10/11权限避坑指南)

理光MP C2500扫描到共享文件夹全流程解决方案与Windows权限深度优化 办公室里那台老当益壮的理光MP C2500复合机&#xff0c;至今仍是许多中小企业的生产力主力。但当IT管理员尝试配置"扫描到共享文件夹"功能时&#xff0c;往往会遭遇浏览网络空白、权限拒绝等"…...

Ubuntu 22.04下编译安装Realtek RTL8852BE驱动,内核版本大于5.18和小于5.18的区别操作

Ubuntu 22.04下Realtek RTL8852BE驱动编译指南&#xff1a;内核版本差异全解析 当你兴奋地在新买的RedmiBook上安装Ubuntu 22.04&#xff0c;却发现WiFi图标神秘消失时&#xff0c;别慌——这很可能是因为Realtek RTL8852BE这块WiFi 6网卡在Linux下的驱动支持问题。作为一块性能…...

CST仿真效率翻倍:手把手教你设置激励与优化器,搞定天线阵列参数优化

CST仿真效率翻倍&#xff1a;手把手教你设置激励与优化器&#xff0c;搞定天线阵列参数优化 天线阵列设计是射频工程师的日常挑战之一。当你在CST中完成基础建模后&#xff0c;真正的考验才刚刚开始——如何高效配置激励、选择合适的优化器&#xff0c;并快速获得准确的仿真结果…...

深入STM32F103定时器:用TIM2输入捕获精准测量脉冲宽度与频率

深入STM32F103定时器&#xff1a;用TIM2输入捕获精准测量脉冲宽度与频率 在嵌入式开发中&#xff0c;精确测量外部信号的脉冲宽度和频率是一项常见但极具挑战性的任务。无论是工业控制中的旋转编码器、消费电子中的红外遥控信号&#xff0c;还是无人机领域的PPM控制信号&#x…...

别再说国产模型不行了!DeepSeek V4 + Claude Code,编程体验直接起飞

别再说国产模型不行了&#xff01;DeepSeek V4 Claude Code&#xff0c;编程体验直接起飞 还在觉得 DeepSeek V4 不如国外模型&#xff1f; 醒醒&#xff0c;2026 年了。DeepSeek V4 系列在代码能力上已经卷到让人窒息——而且价格只有 Claude 官方的零头。 但问题来了&…...

保姆级教程:用ESP32-S3和LVGL驱动3.5寸ILI9488屏幕(附常见编译错误解决)

ESP32-S3与LVGL实战&#xff1a;3.5寸ILI9488屏幕驱动全攻略与疑难解析 当创客们第一次拿到ESP32-S3开发板和3.5寸ILI9488屏幕时&#xff0c;往往会陷入既兴奋又困惑的状态——硬件连接看似简单&#xff0c;但真正要让屏幕亮起来并显示内容&#xff0c;却可能遭遇各种"坑…...

# 040、实战项目五:多 Agent 协作系统 —— 项目经理、开发者、测试者角色模拟

从一次凌晨三点的事故说起 去年做智能客服系统重构&#xff0c;我犯了个低级错误——让单个Agent既写代码又自测。结果上线当天&#xff0c;它把“用户退款”的SQL写成了DELETE FROM orders WHERE status‘refund’&#xff0c;还自信满满地标注“测试通过”。凌晨三点被运维电…...

别再让电机乱跑了!用STM32CubeIDE配置TB6612驱动GB37-520电机,保姆级避坑指南

从零到精通的STM32电机控制实战&#xff1a;TB6612驱动GB37-520全流程解析 第一次尝试用STM32驱动电机时&#xff0c;我遇到了一个令人抓狂的现象——电机要么纹丝不动&#xff0c;要么突然疯狂旋转&#xff0c;甚至冒出可疑的青烟。这种经历在初学者中非常普遍&#xff0c;而…...

Obsidian 完整使用手册 — 目录与索引

Obsidian 完整使用手册 — 目录与索引 一份从入门到精通的 Obsidian 全面指南&#xff0c;涵盖基础操作、核心功能、插件生态、同步备份与进阶技巧。 手册列表 编号手册名称内容概要01基础入门篇软件安装、界面布局、库管理、核心设置02Markdown 语法篇格式化语法、扩展语法、…...

Vivado编译加速:Jobs与Threads参数配置实战指南

1. 项目概述&#xff1a;从一次编译卡顿说起那天下午&#xff0c;我正在赶一个FPGA项目的最后集成&#xff0c;Vivado里点下“Run Implementation”&#xff0c;进度条就像被冻住了一样&#xff0c;半天不动。电脑风扇倒是转得挺欢&#xff0c;可CPU占用率看着也就50%上下。我第…...

低代码平台推荐:零基础业务人员专属

在数字化转型加速的当下&#xff0c;低代码已成为打破IT资源瓶颈的关键抓手。本文专为零基础业务人员深度拆解零门槛低代码平台的选型逻辑与落地路径。通过7大核心问答&#xff0c;系统梳理从技能门槛、平台评估到架构融合的实战经验。据行业调研显示&#xff0c;采用成熟低代码…...

独立开发者如何通过 Taotoken Token Plan 套餐优化项目预算

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何通过 Taotoken Token Plan 套餐优化项目预算 对于独立开发者或小型团队而言&#xff0c;在项目开发中引入大模型能力…...