Les processus enfants générés via le multitraitement partagent-ils des objets créés précédemment dans le programme?
J'ai la configuration suivante:
do_some_processing(filename):
for line in file(filename):
if line.split(',')[0] in big_lookup_object:
# something here
if __name__ == '__main__':
big_lookup_object = marshal.load('file.bin')
pool = Pool(processes=4)
print pool.map(do_some_processing, glob.glob('*.data'))
Je charge un gros objet en mémoire, puis je crée un pool de travailleurs qui doivent utiliser ce gros objet. Le gros objet est accessible en lecture seule, je n'ai pas besoin de passer des modifications entre les processus.
Ma question est la suivante: le gros objet est-il chargé dans la mémoire partagée, comme ce serait le cas si je créais un processus sous unix / c, ou chaque processus charge-t-il sa propre copie du gros objet?
Mise à jour: pour clarifier davantage - big_lookup_object est un objet de recherche partagé. Je n'ai pas besoin de diviser cela et de le traiter séparément. Je dois en garder un seul exemplaire. Le travail dont j'ai besoin pour le fractionner consiste à lire de nombreux autres fichiers volumineux et à rechercher les éléments de ces fichiers volumineux par rapport à l'objet de recherche.
Mise à jour supplémentaire: la base de données est une bonne solution, memcached pourrait être une meilleure solution et le fichier sur disque (shelve ou dbm) pourrait être encore meilleur. Dans cette question, j'étais particulièrement intéressé par une solution en mémoire. Pour la solution finale, j'utiliserai hadoop, mais je voulais voir si je pouvais également avoir une version locale en mémoire.
marshal.load
parent et pour chaque enfant (chaque processus importe le module).