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.
Iemand tips?
Evenredig verdelen?
Re: Evenredig verdelen?
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??
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??
-
- Nieuw lid
- Berichten: 3
- Lid geworden op: 07 mei 2009, 21:02
Re: Evenredig verdelen?
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.
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?
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?
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?
-
- Nieuw lid
- Berichten: 3
- Lid geworden op: 07 mei 2009, 21:02
Re: Evenredig verdelen?
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.
Ik wil een bestand in 4 delen splitsen, zo evenredig mogelijk.
Dit om elke cpu-core een gelijke workload te geven.
Re: Evenredig verdelen?
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.
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.