Wie kann ich Multiprocessing in Python verwenden, um Millionen von Vergleiche durchzuführen?Python

Python-Programme
Anonymous
 Wie kann ich Multiprocessing in Python verwenden, um Millionen von Vergleiche durchzuführen?

Post by Anonymous »

Mein Ziel ist es, einen Vergleich zwischen 2 verschiedenen Zuständen einer Rubiks Cube -Klasse zu verfolgen, die für sich genommen einfach ist. Das Problem kommt, wenn Sie etwas in der Größenordnung von 900 Millionen Vergleiche berechnen müssen, um alle von ihnen zu durchgehen. Als Referenz vergleichen wir, ob 2 Curbestates aus 2 verschiedenen Listen genau gleich sind. Kompilieren einer Liste einfacherer Vorgänge für Pool-Multiprozess (verursacht ein Speicherproblem)
[*] Einstellung von Poolprozessanzahl und/oder ChunkSize für Pool.imap_unordered

Ich möchte, dass diese Arbeit diese Arbeit mit Multiples-und My-BR/ABROCESS-und My-aktuellen Code aussieht. PrettyPrint-Override ">print("Beginning pooling, with a new pool for each start pair. This may take a while...")
final_algs=[]
startcomparisons=0
for pairA in startcube_pairs:
comparisonlist=[]
startcomparisons+=1
print(f"Starting comparison block {startcomparisons}/{len(startcube_pairs)}")
for pairB in solvedcube_pairs:
comparisonlist.append([pairA, pairB])
# now we have a small list of comparisons to make, and we will start comparing what we currently have. If we just put all possible pairs in a list, we encounter a memory problem.
with Pool() as pool:
results = pool.imap_unordered(comparecubes_returnsolution_ifexists, comparisonlist, chunksize=4096)
# imap_unordered means the processes will not necessarily start in order, which is fine since we don't care what order we get algorithms out

for result in results: # this portion existing shows all the subprocesses in the task manager so we will keep it
if result != None:
print(f"Found: [{alg_as_str(result)}] length: {len(result)}")
final_algs.append(result)
else: pass
print(f"Finished comparison block {startcomparisons}/{len(startcube_pairs)}\n\n")
< /code>
Mit dieser Version des Codes verbrauchen der Python-Prozess und seine Unterprozesse nur gemeinsam 7-9% CPU, wobei die meisten Arbeiter aus dem Pool weniger als 0,5% meiner CPU verwenden. Mein Ziel ist, dass ich, wenn ich in der Lage wäre, die Multiprozessierung besser zu verwenden, während ich in der Lage wäre, ein Ziel 40-60% meiner CPU zu verwenden, während ich diese Vergleiche ausführt. Wenn ja, kann ich Python erlauben, mehr Verarbeitungsleistung zuzuweisen, ohne den Gedächtnis meines Systems zu nukieren?from multiprocess import Pool
import math as m
import random

class basicdata:
datavalues=[]
def __init__(self):
self.datavalues = [[[random.randint(1,7) for i in range(3)] for j in range(3)] for k in range(6)]

dataset_1=[basicdata() for i in range(155000)]
dataset_2=[basicdata() for i in range(155000)]

def isdataequal(args):
dataset_1=args[0]
dataset_2=args[1]
isequal=True
for i in range(len(dataset_1)):
for y in range(3):
for x in range(3):
if dataset_1[y][x] != dataset_2[y][x]:
if dataset_1[y][x] != 7: isequal=False # 7 represents a value who's comparison is unimportant to us

if isequal: return dataset_1
else: return None

if __name__ == "__main__":
final_results=[]
print("Beginning comparisons")
for data_1 in dataset_1:
comparisonlist=[]
for data_2 in dataset_2:
comparisonlist.append([data_1.datavalues, data_2.datavalues])

with Pool() as pool:
results = pool.imap_unordered(isdataequal, comparisonlist, chunksize=4096)

for result in results:
if result != None:
final_results.append(result)
else: pass
print(f"Finished a comparison block")

print(final_results)
< /code>
sollte reproduzierbarer Code sein. Interessanterweise verwendet diese Reduzierung des Programms 99% CPU -Strom für Task -Manager in kurzen Bursts, wodurch sich die zuvor angegebenen Nutzung von weniger als 0,5% zwischen den Nutzungsstücken verringert. Die Zeit, um jeden Vergleich abzuschließen, unterscheidet sich jedoch nicht signifikant. Außerdem möchte ich feststellen, dass alles, was ich von diesem Projekt möchte, dass die Vergleiche nicht buchstäbliche Tage benötigen, um zu berechnen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post