Einzelnen Beitrag anzeigen

DieDolly

Registriert seit: 22. Jun 2018
1.913 Beiträge
 
#8

AW: TObjectList-Einträge auf meherere Threads aufteilen

  Alt 19. Jan 2021, 11:51
Zitat:
Bei SSDs könnte man auch beim Lesen der Dateien parallele Zugriffe versuchen, aber auch nicht unbeschränkt viele, da kommt es auf die Größe der Dateien an wo hier Optimierungspotential ist.

Man könnte auch mit MMFs arbeiten um Windows so eine Optimierung der Zugriffe zu ermöglichen, wenn es sich um große Dateien handelt.
Ich lese keine Dateien. Es geht nur um die Aufteilung der Listen.


Ich kann euch ja mal meinen absolut scheuslichen Code zeigen. Dann versteht ihr, warum ich hier nachfrage.
An der Sache mit den Threads kann ich nichts ändern. Es geht nur um die Aufteilung / Zuweisung in die Threads/Erstellung der Threads

Delphi-Quellcode:
MaxThreadCount := 8;
FilesPerThread := MainProcessFileList_ObjectList.Count div MaxThreadCount;
SetLength(TmpFileLists_ObjectList, MaxThreadCount);

for i := 0 to MaxThreadCount - 1 do
 begin
  try
   if MainProcessFileList_ObjectList.Count >= FilesPerThread then
    begin
     TmpFileLists_ObjectList[i] := TObjectList<TFileEntry_CopyProcess>.Create;
     TmpFileLists_ObjectList[i].OwnsObjects := False;
     TmpFileLists_ObjectList[i].Clear;

     iCnt := FilesPerThread;

     for j := 0 to iCnt - 1 do
      begin
       TmpFileLists_ObjectList[i].Insert(j, MainProcessFileList_ObjectList.Items[j]);
      end;

     for j := iCnt - 1 downto 0 do
      begin
       MainProcessFileList_ObjectList.Delete(j);
      end;

     // Thread erstellen
     if TmpFileLists_ObjectList[i].Count > 0 then
      begin
       createCopyThread(TmpFileLists_ObjectList[i], ..., ...); // ERSTELLUNG DES THREADS MIT DEM REST DER IN TmpFileLists_ObjectList DRIN IST
      end;
    end
   else
    Break;
  except
   // Mache dies und das im Fall des Falles
  end;
 end; // for

// Wenn noch Dateien "übrig" bleiben (z.B. bei 130 Dateien, 8 Threads bleiben 2 Dateien "übrig")
if (MainProcessFileList_ObjectList.Count > 0) then
 begin
  // Thread erstellen
  createCopyThread(TmpFileLists_ObjectList[i], ..., ...); // ERSTELLUNG DES THREADS MIT DEM REST DER IN TmpFileLists_ObjectList DRIN IST

  for i := MainProcessFileList_ObjectList.Count - 1 downto 0 do
   begin
    MainProcessFileList_ObjectList.Items[i].Free;
    MainProcessFileList_ObjectList.Delete(i);
   end;
 end;
Zitat:
TParallel.For hat eine Überladung mit einem Stride Parameter. Damit ließe sich das im genannten Beispiel so lösen:
Wofür ist denn das Low- und HighInclusive?
Low = einfach 1 und High = Anzahl der Dateien?

In meinem Fall also?
Delphi-Quellcode:
TParallel.For(MainProcessFileList_ObjectList.Count div MaxThreadCount, 1, MainProcessFileList_ObjectList.Count,
 procedure(Index: Integer)
  begin
   // Bearbeite Listeneintrag[Index]
  end);
Dieses Parallel.For verstehe ich noch nicht so richtig. Wie packe ich die Listeneinträge jetzt in einen Thread? Also bei 125 Dateien 16 Dateien pro Thread?
createCopyThread() darf ich in diesem Fall nur 8x aufrufen.
createCopyThread erwartet als letzten Parameter "IsLastThreads: Boolean". Ich muss also auch irgendwie rausfinden, welcher der letzte Thread ist.

Wie mache ich das alles mit TParallel.For? Kann man meinen Code ansonsten irgendwie verbessern:

Geändert von DieDolly (19. Jan 2021 um 12:48 Uhr)
  Mit Zitat antworten Zitat