![]() |
Bytes auftrag aufteilen
Hi DPler
Ich hab da ein fast schon mathematisches Problem. Ich habe eine Datei und ich möchte die Bytes gleichmäßig und ohne Lücken aufteilen. Also wenn ich eine Datei mit 10 Bytes habe und sie auf drei Tasks gleichmäßig aufteilen will dann würde rein rechnerisch jeder Task 3,3333333 Bytes bekommen da ich aber nur "ganze" Bytes verarbeiten kann muss die aufteilung 3,3,4 sein. Also es muss nicht jeder Task genau gleichviele Bytes bekommen aber des wichtigste ist des sie halbwegs gleichmäßig aufgeteilt werden und kein Byte ausgelassen wird. Ich hoffe ich habe mich verständlich ausgedrückt |
Re: Bytes auftrag aufteilen
Hi,
also nehmen wir an, Du hast jetzt 10 Bytes. Dann machst Du 10 div 3. Das wäre dann 3 Bytes pro Task. Nun prüfst Du auf den Rest, also entweder 10 mod 3 oder Du zählst die 3 Bytes * 3 Tasks und ziehst das von 10 ab und fügst diesen Wert dem letzten Task zu. mfG mirage228 |
Re: Bytes auftrag aufteilen
naja sowas hab ich mir auch schon überlegt aber funktioniert des jedesmal?
|
Re: Bytes auftrag aufteilen
Zitat:
mfG mirage228 |
Re: Bytes auftrag aufteilen
Mit 10 div 3 kriegst du die Anzahl der Bytes die in JEDEN einfliessen müssen. Mit 10 mod 3 kriegst du die Anzahl der Tasks, die jeweils EIN byte MEHR benötigen.
|
Re: Bytes auftrag aufteilen
ok dann werd ich so machen
|
Re: Bytes auftrag aufteilen
Pseudocode:
Delphi-Quellcode:
P.S.: Diesmal kam sogar der rote Kasten, aber jetzt habe ich das extra getippt, jetz' schick' ich des auch los.
BytesPerTask = NumberOfBytes div TaskCount);
for i := 0 to TaskCount - 2 do StartTask(i (* Task ID *), i * BytesPerTask (* First byte the Task processes *), BytesPerTask (* Number of bytes the task processes*) ); // der letzte task kriegt den Rest, niemals mehr als (BytesPerTask + NumberOfBytes) StartTask(i, (TaskCount - 1) * BytesPerTask, NumberOfBytes - ((TaskCount - 1) * BytesPerTask)); |
Re: Bytes auftrag aufteilen
@mirage228: wenn nun aber 11 Bytes aufgeteilt werden müssen, dann erhält Thread 1&2 davon 3 Bytes und Thread 3 würde (nach deinem Algorithmus) 5 Bytes erhalten. Besser wäre aber doch 3/4/4!
Mein Vorschlag:
Delphi-Quellcode:
So erhält jeder Task erstmal gleich viele Bytes zugewiesen, anschließend werden die restlichen n Bytes auf die ersten n Tasks verteilt.
for i := 1 to ANZ_TASKS do
Task[i].Bytes := GesamtBytes div ANZ_TASKS; for i := 1 to GesamtBytes mod ANZ_TASKS do Task[i].Bytes := Task[i].Bytes + 1; |
Re: Bytes auftrag aufteilen
Ich setz' noch einen drauf! :zwinker:
Hier eine gleichmäßige Verteilung mit Bresenham-Algorithmus:
Delphi-Quellcode:
Accu := 0;
for i := 0 to Count - 1 do begin inc(Accu, GesamtMenge); Anteil[i] := Accu div Count; Accu := Accu mod Count; end; |
Re: Bytes auftrag aufteilen
uii so genau muss es dann auch nicht sein :zwinker:
Also ich habs jetzt ziemlich einfach gelöst: Jeder Task bekommt des: ByteSize div Tasks und der letzte dann noch den rest (JaJa ich weiss der letzte ist halt immer der was am meisten arbeiten muss :-D ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz