Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bytes auftrag aufteilen (https://www.delphipraxis.net/55570-bytes-auftrag-aufteilen.html)

gsh 23. Okt 2005 13:43


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

mirage228 23. Okt 2005 13:47

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

gsh 23. Okt 2005 13:49

Re: Bytes auftrag aufteilen
 
naja sowas hab ich mir auch schon überlegt aber funktioniert des jedesmal?

mirage228 23. Okt 2005 13:50

Re: Bytes auftrag aufteilen
 
Zitat:

Zitat von gsh
naja sowas hab ich mir auch schon überlegt aber funktioniert des jedesmal?

Also ich wüsste nicht, wieso das nicht immer funktionieren sollte...

mfG
mirage228

Jelly 23. Okt 2005 13:52

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.

gsh 23. Okt 2005 13:53

Re: Bytes auftrag aufteilen
 
ok dann werd ich so machen

tommie-lie 23. Okt 2005 13:56

Re: Bytes auftrag aufteilen
 
Pseudocode:
Delphi-Quellcode:
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));
P.S.: Diesmal kam sogar der rote Kasten, aber jetzt habe ich das extra getippt, jetz' schick' ich des auch los.

Grishnak 24. Okt 2005 08:37

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:
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;
So erhält jeder Task erstmal gleich viele Bytes zugewiesen, anschließend werden die restlichen n Bytes auf die ersten n Tasks verteilt.

Flocke 24. Okt 2005 08:53

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;

gsh 24. Okt 2005 19:06

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