收藏
回答

云函数能处理多大的文件?

看文档说,云函数有一个可写层,只有500M,那么如果用云函数下载并处理一个1G的文件,是不是就会爆掉?

回答关注问题邀请回答
收藏

1 个回答

  • 唐同学
    唐同学
    2021-10-23

    结合实际情况,可以考虑先count统计出数据量,在分批取回。

    也可以考虑通过HTTP API ,用Python下载。

    分享自用的python下载数据库代码:

    import requests
    import json
    import time
    
    
    import datetime
    import pandas as pd
    
    
    env = "这里是你的环境"
    
    
    # 获得token
    this_token = requests.get(
        url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的APPID&secret=你的密码'
    ).json()
    
    
    # 导出数据
    get_data_url = 'https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=' + this_token['access_token']
    get_data_param = {
        "env": env,
        "file_path": "this_file.csv",
        "file_type": 2,
        "query": "const GET = db.collection(\'marker\').field({ _id: true,location: true,machineRoom: true,obdDepartment: true,obdRegion: true,obdGrid: true,classification: true,state: true,obdMaintainer: true,site: true,obdID: true,obdCode: true,obdName: true,parent: true,obdType: true,specs: true,capacity: true,updatedBy: true,updateTime: true,isManualUpdate: true,reportLoss: true,maintenanceExplain: true,changeLog: true,searchIndex: true }).get()"
    }
    get_data = requests.post(url=get_data_url, data=json.dumps(get_data_param)).json()
    
    
    if get_data['errmsg'] == 'ok':
        print('开始导出数据')
    else:
        print('错误:导数数据失败')
        print(get_data)
        exit()
    
    
    # 获得文件地址
    file_url = ''
    
    
    while file_url == '':
        print('正在导出数据...')
        get_file_url = 'https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=' + this_token['access_token']
        get_file_param = {
            "env": env,
            "job_id": get_data['job_id']
        }
    
    
        get_file = requests.post(url=get_file_url, data=json.dumps(get_file_param)).json()
    
    
        if get_file['errmsg'] == 'ok':
            file_url = get_file['file_url']
    
    
            # 如果文件地址为空,则延时2秒再重新获取
            if file_url == '':
                time.sleep(2)
    
    
        else:
            print('错误:获得文件地址失败')
            exit()
    
    
    print('获得文件地址成功')
    
    
    now_time = datetime.datetime.now()
    str_time = now_time.strftime("%Y年%m月%d日 %H时%M分%S秒")
    
    
    
    
    # 格林威治时间转北京时间
    def utc_to_bjs(utc):
        utc_format = "%Y-%m-%dT%H:%M:%S.%fZ"
        utc_time = datetime.datetime.strptime(utc, utc_format)
        localtime = utc_time + datetime.timedelta(hours=8)
        return localtime
    
    
    
    
    print("正在下载文件...")
    
    
    df_box = pd.read_csv(file_url, low_memory=False)
    print("开始处理数据")
    
    
    print("[更新时间]列格式化(格林威治时间转北京时间)")
    df_box['更新时间'] = df_box['更新时间'].apply(lambda x: '' if pd.isna(x) or pd.isnull(x) else utc_to_bjs(x))
    df_box['更新时间'] = pd.to_datetime(df_box['更新时间'])
    
    
    print("正在保存文件...")
    print("数据量较大,请耐心等待...")
    with pd.ExcelWriter('明细(' + str_time + ').xlsx') as writer:
        df_box.to_excel(writer, sheet_name='明细', index=False)
    
    
    
    2021-10-23
    有用
    回复 2
    • 朱佳
      朱佳
      发表于移动端
      2021-10-23
      你的数据超过500M了吗
      2021-10-23
      回复
    • 唐同学
      唐同学
      2021-10-23回复朱佳
      100多M。
      但用HTTP API,500M理论上也没问题,你试一下。
      2021-10-23
      回复
登录 后发表内容