2017-08-31 4 views
0

J'essaye de créer des ouvriers pour une tâche qui implique de lire beaucoup de fichiers et de les analyser.Multiprocessing stockant un tableau de chaînes en lecture seule pour tous les processus

Je veux quelque chose comme ceci:

list_of_unique_keys_from_csv_file = [] # About 200mb array (10m rows) 
# a list of uniquekeys for comparing inside worker processes to a set of flatfiles 

je besoin de plus de fils car il va très lent, en faisant la comparaison avec un processus (10 minutes par fichier).

J'ai un autre ensemble de fichiers plats que je compare le fichier CSV à, pour voir si des clés uniques existent. Cela semble être une carte qui réduit le type de problème.

main.py:

def worker_process(directory_glob_of_flat_files, list_of_unique_keys_from_csv_file): 
    # Do some parallel comparisons "if not in " type stuff. 
    # generate an array of 
    # lines of text like : "this item_x was not detected in CSV list (from current_flatfile)" 
    if current_item not in list_of_unique_keys_from_csv_file: 
    all_lines_this_worker_generated.append(sometext + current_item) 
    return all_lines_this_worker_generated 




def main(): 
    all_results = [] 
    pool = Pool(processes=6) 
    partitioned_flat_files = [] # divide files from glob by 6 
    results = pool.starmap(worker_process, partitioned_flat_files, {{{{i wanna pass in my read-only parameter}}}}) 
    pool.close() 
    pool.join() 

    all_results.extend(results) 
    resulting_file.write(all_results) 

J'utilise à la fois un linux et un environnement Windows, donc peut-être que j'ai besoin (discussion toute la fourche()) quelque chose compatible multi-plateforme. Question principale: Ai-je besoin d'une sorte de pipe ou de file d'attente, je n'arrive pas à trouver de bons exemples de transfert autour d'un grand tableau de chaînes en lecture seule, une copie pour chaque processus de travail?

Répondre

1

Vous pouvez simplement diviser vos paramètres en lecture seule, puis les transmettre.

En fait, chaque processus, même sous-processus, a ses propres ressources, cela signifie que peu importe comment vous lui passez les paramètres, il conservera une copie de l'original au lieu de le partager. Dans ce cas simple, lorsque vous passez les paramètres du processus principal dans des sous-processus, Pool effectue automatiquement une copie de vos variables. Parce que les sous-processus ont juste les copies de l'original, donc la modification ne peut pas être partagée. Cela n'a pas d'importance dans ce cas car vos variables sont en lecture seule.

Mais attention au sujet de votre code, vous devez envelopper les paramètres dont vous avez besoin dans une collection itératives, par exemple:

def add(a, b): 
    return a + b 

pool = Pool() 
results = pool.starmap(add, [(1, 2), (3, 4)]) 
print(results) 
# [3, 7] 
+0

oui, mais la question principale est que je vais avoir, chaque processus/fil tout , doit avoir le même tableau global 'read_of_unique_keys_from_csv_file' en lecture seule ... Cependant, quand j'essaie d'imprimer ce que nous avons dans le processus, il semble qu'il a divisé/divisé le tableau ou quelque chose. Ce n'est pas ce que je veux. Je veux copier le tableau ORIGINAL sur tous les threads/tous les processus. Peut-être que j'ai besoin de lire le fichier principal dans chaque worker, mais je pense qu'il serait idiot d'avoir 200 travailleurs lisant exactement le même fichier au démarrage (donc mon thread principal le lit puis copie le tableau à tout) – Dexter

+0

@Dexter , 'results = pool.starmap (func, [(un_fichier, list_of_unique_keys_from_csv_file) pour one_file dans partitioned_flat_files])' – Sraw

+0

Ouais cela a fonctionné, je me demande pourquoi la méthode itertools ne fonctionne pas. Merci. – Dexter