Pagina 1 van 1

Evenredig verdelen?

Geplaatst: 07 mei 2009, 21:06
door marcelk1607
Stel ik heb een bestand met een bepaalde grootte.
Nu wil ik dit bestand verdelen in x stukken.

Hoe kan ik dat het beste doen? Ik wil een optimale verdeling over x.

MIsschien wel een hele simpele puzzel, maar ik heb al tijden geen wiskunde meer gebruikt. :oops:
Iemand tips?

Re: Evenredig verdelen?

Geplaatst: 07 mei 2009, 21:39
door arie
Wat versta je onder een "optimale verdeling"??
Als het gaat om gelijke verdeling is het een kwestie van delen, bijvoorbeeld:
bestand van 6 MB verdelen in 3 gelijke stukken:
elk stuk wordt 6 MB / 3 = 2 MB.
Maar heb je misschien ook nog aanvullende voorwaarden??

Re: Evenredig verdelen?

Geplaatst: 08 mei 2009, 06:35
door marcelk1607
Sorry ik was niet duidelijk.

Bestandgrootte is altijd een natuurlijk getal.

Als de bestandsgrootte 400 kilobytes is, en je hebt 4 cpu's, dan verdeel ik elk deel in 100 kilobyte.
Is de bestandsgrootte 410 kilobytes, met 4 cpu's, dan verdeel ik 100, 100, 100 en 110.

Ik kan natuurlijk x modulus 4 doen en de eventuele rest bij het vierde deel doen.

Re: Evenredig verdelen?

Geplaatst: 08 mei 2009, 09:34
door arie
Als je n cpu's gelijkmatig wilt vullen met veelvouden=blokken van B bytes (bijvoorbeeld B=1024, of in jouw voorbeeld B=100) + een eventuele rest, kan je de grootte G van het bestand delen door B, je krijgt dan iets in de vorm
G = q*B + r
waarbij
r = rest bij deling van G door B (0 <= r < B)
q = aantal complete blokken van B bytes.
Als r=0, dan moet je Q=q blokken wegzetten over de n cpu's,
als r>0, dan moet je Q=q+1 blokken verdelen over de n cpu's.
Als Q een veelvoud is van n, dan heb je Q/n blokken per cpu nodig,
als Q geen veelvoud is van n, dan krijgen een aantal cpu's 1 blok meer.

Bijvoorbeeld:
n=4 cpu's
blokgrootte B=100
Bestand = 1040
G = 10*100 + 40
r=40>0 => 11 blokken weg te zetten
de 4 cpu's krijgen elk in ieder geval 11/4 = 2 blokken (afronden naar beneden),
de overige 11-2*4 = 3 blokken moeten we over 3 van de 4 cpu's verdelen.
Merk op dat deze 3 blokken 2 blokken van 100 en 1 blok van 40 zijn.

Bedoelde je zoiets?

Re: Evenredig verdelen?

Geplaatst: 08 mei 2009, 21:03
door marcelk1607
Zoiets inderdaad maar ik wil de blokgrootte laten berekenen.
Ik wil een bestand in 4 delen splitsen, zo evenredig mogelijk.
Dit om elke cpu-core een gelijke workload te geven.

Re: Evenredig verdelen?

Geplaatst: 18 mei 2009, 13:57
door tsagld
Grootte n, evenredig verdelen in m blokken:

Stel k = n/m
Stel l = n mod m

Er zijn nu m - l blokken die k groot zijn, en l blokken die k+1 groot zijn.

Bijvoorbeeld:

Grootte 1000, verdelen in 7 blokken:
k = 1000 / 7 = 142
l = 1000 mod 7 = 6

Er zijn nu 7 - 6 = 1 blok van 142, en 6 blokken van 143.

That's it.