使用Python调用Google API上传8GB大文件至Google Drive遇MemoryError
解决Google Drive API上传大文件时的MemoryError问题
嘿,这个问题我之前帮好几个开发者踩过坑——小文件能正常上传,8GB大文件就爆内存,核心原因就是你的代码把整个文件一次性加载到内存里了,系统根本扛不住这么大的内存占用,自然就抛出MemoryError了。
Google Drive API专门提供了**可恢复上传(Resumable Uploads)**的方案,完美解决大文件上传的内存问题,而且还支持断点续传,下面给你具体的解决思路和代码示例:
为什么会出现MemoryError?
- 小文件体积小,能轻松被加载到内存中完成上传;
- 8GB的文件如果直接用
read()这类方法读入内存,会瞬间占用数GB的内存,超出系统可用内存限制,触发内存错误。
解决方案:使用可恢复分块上传
以Python的Google Client Library为例,只需要调整上传逻辑,用分块的方式逐步读取文件并上传,每次只把一小部分文件加载到内存:
代码示例
from googleapiclient.discovery import build from googleapiclient.http import MediaFileUpload from google.oauth2.credentials import Credentials # 初始化Drive服务(假设你已经完成了OAuth2认证,有有效的凭证文件) creds = Credentials.from_authorized_user_file('token.json', ['https://www.googleapis.com/auth/drive']) drive_service = build('drive', 'v3', credentials=creds) # 定义文件元数据(文件名、父文件夹等) file_metadata = { 'name': 'large_8gb_file.bin', # 如果需要指定上传到某个文件夹,添加'parents': ['文件夹ID'] } # 关键配置:开启可恢复上传+设置分块大小 # chunksize建议设置为10MB-100MB,根据你的网络和内存情况调整 media = MediaFileUpload( 'path/to/your/8gb_file', chunksize=10 * 1024 * 1024, # 10MB每块 resumable=True ) # 创建上传会话并逐步分块上传 request = drive_service.files().create(body=file_metadata, media_body=media) response = None while response is None: status, response = request.next_chunk() if status: print(f"上传进度: {int(status.progress() * 100)}%") print(f"上传完成!文件ID: {response.get('id')}")
核心关键点说明
resumable=True:告诉API创建一个可恢复的上传会话,允许分块传输,中途网络中断后可以从断点继续上传;chunksize:控制每次上传的文件块大小,确保每次只有一小块文件被加载到内存,避免内存溢出;- 绝对避免使用
open(file, 'rb').read()这类一次性读取整个文件的操作,必须用流式/分块的方式处理大文件。
其他注意事项
- 如果你用的是Java、Node.js等其他语言,思路完全一致:找到官方库中对应的可恢复上传API,不要一次性加载整个文件到内存;
- 确保你的Google Drive账户有足够的存储空间容纳8GB的文件;
- 如果上传过程中出现中断,只需要重新运行上传代码,API会自动识别未完成的上传会话,从断点继续。
按这个方式修改后,别说8GB,几十GB的大文件都能稳定上传,而且不会再出现内存溢出的问题。
内容的提问来源于stack exchange,提问作者Vikram Singh Chandel
相关产品推荐
相关产品推荐

