You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:25:40