AMcoder - javascript, python, java, html, php, sql

Golang amazon s3 ինչպես կարող եմ ավելի արագ վերբեռնել պատկերներ

Ես ունեմ որոշ պատկերներ, որոնք ես վերբեռնում եմ իմ s3 աքաունթում՝ օգտագործելով amazon s3 պաշտոնական փաթեթը: Իմ պատկերները սովորաբար կազմում են մոտ 250 - 350 ԿԲ, այնքան փոքր պատկերներ, սակայն դրանք վերբեռնելու համար տևում է մոտ 8 կամ 9 վայրկյան, ինչը չափազանց մեծ է թվում, արագության բարելավման վերաբերյալ ցանկացած առաջարկություն հիանալի կլինի: Սա իմ ծածկագիրն է, և եթե ես հանում եմ պատկերի չափափոխման կոդը, այն դեռ 8 ​​կամ 9 վայրկյան տևում է:

      func UploadStreamImage(w http.ResponseWriter, r *http.Request) {


          r.ParseForm()
    var buff bytes.Buffer


    wg := sync.WaitGroup{}

    wg.Add(1)
    go func() {
        defer wg.Done()

        var buf bytes.Buffer
        sess, _ := session.NewSession(&aws.Config{
            Region:      aws.String("us-west-2"),
            Credentials: credentials.NewStaticCredentials(aws_access_key_id, aws_secret_access_key, ""),

        })

        svc := s3.New(sess)

        file, handler, err := r.FormFile("file")
        if err != nil {
            log_errors(" error on upload",err.Error(),w)
            fmt.Println("Error Uploading Image")
            return
        }
        defer file.Close()

        img,err := imaging.Decode(file)
        if err != nil {
            print("Imaging Open error")
            log_errors("Error decoding",err.Error(),w)
            return
        }

                imgSize,err := strconv.Atoi(r.FormValue("imgsize"))

        if err != nil {
            println("Error converting to integer")
            log_errors("Error converting to integer",err.Error(),w)
            return
        }

        b := img.Bounds()
        heightImg := b.Max.Y
        widthImg := b.Max.X


        // resize image
        height := int(float64(heightImg) * .23)
        width := int(float64(widthImg) * .23)


        if imgSize < 401 {
            height = int(float64(heightImg) * 1)
            width = int(float64(widthImg) * 1)

        } else if imgSize  >= 401 && imgSize < 900 {
               height = int(float64(heightImg) * .68)
               width = int(float64(widthImg) * .68)
               println("Middle Image")
                  } else if  imgSize  >= 900 && imgSize < 1300 {
            height = int(float64(heightImg) * .45)
            width = int(float64(widthImg) * .45)
           } else if  imgSize  >= 1301 && imgSize < 1700 {
            height = int(float64(heightImg) * .40)
            width = int(float64(widthImg) * .40)
        } 


        new_img := imaging.Resize(img,width,height, imaging.Lanczos)
       // end resize

        err = imaging.Encode(&buf,new_img, imaging.JPEG)
        if err != nil {
            log.Println(err)
            log_errors(" error encoding file",err.Error(),w)
                        return
        }


        r := bytes.NewReader(buf.Bytes())



        read_file,err := ioutil.ReadAll(r)
        if err != nil {
            fmt.Println("Error Reading file")
            log_errors(" error reading file",err.Error(),w)
            return

        }




        file.Read(read_file)
        fileBytes := bytes.NewReader(read_file)
        fileSize, err := buff.ReadFrom(fileBytes)
        if err != nil {
            log_errors(" error fileSize",err.Error(),w)
            return
        }
        fileType := http.DetectContentType(read_file)
        path := handler.Filename
        params := &s3.PutObjectInput{
            Bucket: aws.String("bucket name"),
            Key: aws.String(path),
            Body: fileBytes,

            ContentLength: aws.Int64(fileSize),
            ContentType: aws.String(fileType),
        }

        resp, err := svc.PutObject(params)
        if err != nil {
            fmt.Printf("bad response: %s", err)
            log_errors("error in putObject",err.Error(),w)
            return
        }

        fmt.Println(w,"Done")


    }()
    wg.Wait()

}
07.07.2017

Պատասխանները:


1

Improving speed? սա սուբյեկտիվ է. կախված է բազմաթիվ գործոններից, ինչպիսիք են սերվերի վերբեռնումը, հաճախորդի վերբեռնումը և այլն:

Փոխարենը, ես կներկայացնեմ իմ տվյալները՝ բարելավելու ձեր կոդի հատվածները.

  • Սկսենք sync.WaitGroup-ից - ես օգուտ չեմ տեսնում ձեր կոդերի հոսքի համաձայն, դուք պարզապես ստեղծում եք և սպասում, որ գորուտինը ավարտվի: Փոխարենը օգտագործել առանց WaitGroup-ի: Tip: Մի օգտագործեք հնարավորությունը հանուն/բզզոցի համար; օգտագործել այն անհրաժեշտության դեպքում:
  • Մի ստեղծեք մի քանի bytes.Buffer և Reader, երբ դուք կարող եք իրականացնել առանց դրա: Համար օրինակ. Չափափոխելուց հետո ստանալով fileSize, պարզապես կատարեք buf.Len():
  • Եթե ​​ցանկանում եք բեռնաթափել AWS-ի վերբեռնումը, ապա հանեք վերբեռնման կոդը առանձին funcի մեջ և անվանեք այն որպես գորուտին:

Ես թարմացրել եմ ձեր կոդի հատվածը (ես չեմ փորձարկել ձեր կոդը, ուստի խնդրում ենք շտկել/բարելավել այն ըստ պահանջի).

func UploadStreamImage(w http.ResponseWriter, r *http.Request) {
    file, handler, err := r.FormFile("file")
    if err != nil {
        log_errors(" error on upload", err.Error(), w)
        fmt.Println("Error Uploading Image")
        return
    }
    defer file.Close()

    // Suggestion: You can calculate the file size from bytes.
    // instead getting it from form; since after resize image will change
    imgSize, err := strconv.Atoi(r.FormValue("imgsize"))
    if err != nil {
        println("Error converting to integer")
        log_errors("Error converting to integer", err.Error(), w)
        return
    }

    img, err := imaging.Decode(file)
    if err != nil {
        print("Imaging Open error")
        log_errors("Error decoding", err.Error(), w)
        return
    }

    b := img.Bounds()
    heightImg := b.Max.Y
    widthImg := b.Max.X

    // resize image
    height := int(float64(heightImg) * .23)
    width := int(float64(widthImg) * .23)

    if imgSize < 401 {
        height = int(float64(heightImg) * 1)
        width = int(float64(widthImg) * 1)

    } else if imgSize >= 401 && imgSize < 900 {
        height = int(float64(heightImg) * .68)
        width = int(float64(widthImg) * .68)
        println("Middle Image")
    } else if imgSize >= 900 && imgSize < 1300 {
        height = int(float64(heightImg) * .45)
        width = int(float64(widthImg) * .45)
    } else if imgSize >= 1301 && imgSize < 1700 {
        height = int(float64(heightImg) * .40)
        width = int(float64(widthImg) * .40)
    }

    new_img := imaging.Resize(img, width, height, imaging.Lanczos)
    // end resize

    var buf bytes.Buffer
    err = imaging.Encode(&buf, new_img, imaging.JPEG)
    if err != nil {
        log.Println(err)
        log_errors(" error encoding file", err.Error(), w)
        return
    }

    fileType := http.DetectContentType(buf.Bytes())
    fileSize := buf.Len()
    path := handler.Filename
    params := &s3.PutObjectInput{
        Bucket: aws.String("bucket name"),
        Key:    aws.String(path),
        Body:   bytes.NewReader(buf.Bytes()),

        ContentLength: aws.Int64(fileSize),
        ContentType:   aws.String(fileType),
    }

    resp, err := svc.PutObject(params)
    if err != nil {
        fmt.Printf("bad response: %s", err)
        log_errors("error in putObject", err.Error(), w)
        return
    }

    fmt.Println("Done", resp)
}
08.07.2017
  • Շատ շնորհակալ եմ խորհուրդների համար, որոնք շատ օգտակար են ձեր առաջարկությունների իրականացմանը: 08.07.2017
  • Ողջույն, ես հարց ունեմ, որ վերը նշված կոդը օգտագործվում է հետին պլանում, բայց եթե ենթադրենք, որ ես ունեի 1000 օգտատեր, որոնք բոլորը վերբեռնում էին տարբեր պատկերներ, մի՞թե Goroutines-ը սպասումով: Համաժամեցումը կբարելավի կատարումը: Ես դեռ բավականին նոր եմ Գոլանգում: 08.07.2017
  • Go-ում http.Server-ը կատարում է յուրաքանչյուր հարցումը goroutine-ով, այս պահին սպասման կարիք չկա: Ենթադրենք, դուք ունեք մեկից ավելի գործողություն, որը պետք է ինքնուրույն կատարեք յուրաքանչյուր հարցման համար, ապա օգտագործեք goroutine sync.waitgroup-ի հետ: 08.07.2017
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..