Iterator in Blocks von mehreren items abfragen
Verfasst: Freitag 10. Januar 2020, 10:22
Hallo Leute,
vielen Dank für die Hilfe die letzten Tage. Ich hab leider schon wieder eine Frage.
Ich möchte einen Iterator in Blocks von mehreren items abfragen (z.B. 10000 items auf einmal). Der iterator ist sehr lang (mehrere Millionen items) und ich möchte die Blocks dann in einer Funktion bearbeiten und diese an den ProcessPoolExecutor weitergeben, um den Ablauf schneller zu machen.
Ich habe das ganze bisher als Verschachtelung von 3 loops gelöst: Außen eine while-loop, die bis zum Ende des iterators True bleibt, in der Mitte eine Loop für die Anzahl der parallelen Prozesse, die gestartet werden sollen und innen noch eine Loop für die Anzahl an items pro Prozess.
Ich überlege, ob man das ganze irgendwie schöner lösen kann. Ich komme aber nicht drauf. Ich habe mit itertools.islice() herumprobiert, aber dann habe ich keine Rückmeldung mehr wann der iterator leer ist.
vielen Dank für die Hilfe die letzten Tage. Ich hab leider schon wieder eine Frage.
Ich möchte einen Iterator in Blocks von mehreren items abfragen (z.B. 10000 items auf einmal). Der iterator ist sehr lang (mehrere Millionen items) und ich möchte die Blocks dann in einer Funktion bearbeiten und diese an den ProcessPoolExecutor weitergeben, um den Ablauf schneller zu machen.
Ich habe das ganze bisher als Verschachtelung von 3 loops gelöst: Außen eine while-loop, die bis zum Ende des iterators True bleibt, in der Mitte eine Loop für die Anzahl der parallelen Prozesse, die gestartet werden sollen und innen noch eine Loop für die Anzahl an items pro Prozess.
Code: Alles auswählen
iterator = iter(range(100))
bool_more_input = True
while bool_more_input:
items_for_process = [[] for _ in range(4)] #Liste leeren
for i in range(4): #Anzahl der Prozesse
k=0
while k < 10 and bool_more_input: #Anzahl items pro Prozess
try:
item = next(iterator)
items_for_process[i].append(item)
k += 1
except StopIteration:
bool_more_input = False
print('Give items to ProcessPoolExecutor:')
print(items_for_process)