Re: programming::algo::bash - split list in buckets
Alex 'CAVE' Cernat <[email protected]> Tue, 2 Jul 2019 16:41:21 +0300
| Newsgroups | gmane.org.user-groups.rlug.offtopic |
|---|---|
| Message-ID | <[email protected]> |
On 02-Jul-19 3:32 PM, Adrian Sevcenco wrote: > On 7/2/19 3:12 PM, Alex 'CAVE' Cernat wrote: >> deci sa zicem ca ai niste tupli de genul nume fisier, weight (sau >> lungime) si vrei sa generezi n liste de tupli de astia, astfel incat >> suma acelor weight-uri sa fie cat de cat pe acolo >> >> cea mai simpla metoda (nu insa si cea mai eficienta) ar fi urmatoarea: >> - ordonarea listei dupa lungime, descrescator >> - si apoi mulinezi in lista, de genul L1, L2, ... Ln, Ln, ..., L2, L1 si >> iar L1, L2 ... pana termini cu lista >> nu e cea mai eficienta metoda, dar cand lista tinde spre infinit >> statistic "galetile" ar fi echilibrate >> >> o alta varianta mai eficienta ar fi o varianta de problema rucsacului >> (desi aia e alta mancare de peste pana la urma) >> ceva de genul: faci suma weight-urilor, faci o medie per fiecare bucket, >> si apoi incepi sa gasesti combinatii de tz elemente din lista astfel >> incat suma weight-urilor sa fie cat mai apropiat de media calculata >> si aici poate sa-ti dea cu virgula rau daca distributia este >> dezechilibrata, dar are mai multe sanse de reusita decat cea de mai sus >> >> de obicei, cu cat dai mai multe detalii cu atat sunt mai multe sanse sa >> gasim o solutie cat mai aproape de ce vrei tu ... > so fisierele astea le procesez pe un cluster in batchuri si ramanea o > long-lived tail cu joburile care aveau batchul cu fisierele cele mai mari > in setul curent sunt 7731 fisiere cu marimi intre 357k si 931M (3.9T > in total) > > dar m-a lamurit sir Wolf :) daca la liste pastrez atasat si marimea > totala din lista, urmatoarele aditii pot sa le fac de ex in punga cea > mai mica... e adevarat asta ar implica o gasire de minim pentru > fiecare aditie dar nu cred ca e vital.. asa ar duce la o buna > aproximare, mai ales ca dupa sortarea initiala, raman cantitati din ce > in ce mai mici de distribuit intre galeti > > Merci! > Adrian ar mai fi o varianta relativ usor de implementat, pe tipul distributed workers, si un server de mq (rabbitmq spre exemplu, ai si client in bash), sau altceva de cozi din procesul master iei si bagi job-uri in coada; fiecare worker (care trebuie pre-pornit) ia un job din coada, il prelucreaza, ia urmatorul,il prelucreaza samd in functie de statistica job-urilor iarasi s-ar putea sa fie nu cel mai eficient (ca e FIFO) bine, daca e pe aceeasi masina atunci poti direct cu multiple fork si wait direct din bash, si nu ai nevoie de cozi, tii "coada" intr-un array in bash insa la fel, iar nu e eficient, daca vrei sa ai toate sansele ca se termina toate in aproximativ acelasi timp deja nu mai e simpla coada, deja trebuie niste algoritmi mai speciali, cam ce daduse si Wolfy poate daca totusi sortezi lista respectiva descrescator inainte de a da drumul la job-uri obtii in cele mai multe cazuri o eficienta destul de mare fara sa te complici cu jde algoritmi (dar intri pe taramul de statistica pura) Alex