Google Cloud Storage单文件上传过慢,寻求批量上传优化方案
解决方案:提速Google Cloud Storage批量文件上传
针对你每天上传3-4万个文件的场景,当前串行上传的方式会因请求往返延迟导致效率极低,以下是几种大幅提速的方法:
1. 并发上传(最显著的提速方式)
当前代码逐个串行等待上传完成,改成并发上传可同时处理多个文件请求,充分利用网络带宽。推荐用p-limit库控制并发量(建议设置50-100个并发,根据服务器资源调整),避免请求过载。
代码示例:
const {Storage} = require('@google-cloud/storage'); const fs = require('fs'); const path = require('path'); const pLimit = require('p-limit'); // 限制并发数,根据服务器配置调整 const limit = pLimit(80); function getAllFilesInDirectoryRecursively(dir){ const files = fs.readdirSync(dir, {withFileTypes: true}); for (const file of files) { if (file.isDirectory()) { yield* getAllFilesInDirectoryRecursively(path.join(dir, file.name)); } else { yield path.join(dir, file.name); } } } const storage = new Storage(); const bucket = storage.bucket('bucket.domain.com'); (async function(){ const files = Array.from(getAllFilesInDirectoryRecursively('./main/')); // 将每个上传任务包装成受并发限制的函数 const uploadTasks = files.map(filePath => limit(async () => { await bucket.upload(filePath, { destination: filePath.replace('main', ''), // 小文件关闭断点续传,减少开销 resumable: false, // 可选:文本类文件开启gzip压缩,减少传输数据量 // gzip: true }); })); // 等待所有任务完成 await Promise.all(uploadTasks); console.log('All files uploaded'); })();
2. 优化上传参数
- 关闭断点续传:若文件多为小文件(<10MB),设置
resumable: false可避免分块上传的额外请求开销,大幅提升小文件上传速度。 - 调整分块大小:针对大文件,设置
chunkSize(如10 * 1024 * 1024即10MB),平衡分块数量与单块上传效率。 - 开启压缩:JSON、HTML、日志等文本类文件,开启
gzip: true可减少上传数据量,GCS还会自动为存储文件提供gzip压缩访问支持。
3. 分批处理大文件列表
若文件数量极多,一次性生成所有任务可能占用过多内存,可按批次处理:每1000个文件为一批,完成一批后再处理下一批,避免内存溢出。
分批处理代码示例:
// ...(前面的函数和初始化代码不变) (async function(){ const files = Array.from(getAllFilesInDirectoryRecursively('./main/')); const batchSize = 1000; for (let i = 0; i < files.length; i += batchSize) { const batch = files.slice(i, i + batchSize); const uploadTasks = batch.map(filePath => limit(async () => { await bucket.upload(filePath, { destination: filePath.replace('main', ''), resumable: false }); })); await Promise.all(uploadTasks); console.log(`Completed batch ${Math.floor(i/batchSize) + 1}`); } console.log('All files uploaded'); })();
4. 其他建议
- 使用GCS Transfer Service:如果是大规模文件迁移(本地服务器/其他云存储到GCS),Google Cloud提供的Transfer Service无需自行编码,可更高效地批量传输,适合一次性或周期性迁移场景。
- 检查网络环境:若在Google Cloud虚拟机上上传,速度会远快于本地网络;本地上传则建议确保网络带宽充足、延迟低。
内容的提问来源于stack exchange,提问作者Cedric Hadjian
相关产品推荐
相关产品推荐

