मुझे लगता है कि आप पूरे डेटासेट को रैम में एक numpy सरणी में लोड करने में सक्षम हैं, और आप लिनक्स या मैक पर काम कर रहे हैं। (यदि आप विंडोज़ पर हैं या आप सरणी को रैम में फिट नहीं कर सकते हैं, तो आपको शायद डिस्क पर फ़ाइल में सरणी की प्रतिलिपि बनाना चाहिए और इसे एक्सेस करने के लिए numpy.memmap का उपयोग करना चाहिए। आपका कंप्यूटर डिस्क से डेटा को रैम में कैश करेगा कर सकते हैं, और उन कैशों को प्रक्रियाओं के बीच साझा किया जाएगा, इसलिए यह एक भयानक समाधान नहीं है।)
उपरोक्त धारणाओं के तहत, यदि आपको multiprocessing
के माध्यम से बनाई गई अन्य प्रक्रियाओं में डेटासेट को केवल पढ़ने की आवश्यकता है, तो आप बस इसे बना सकते हैं डेटासेट और फिर अन्य प्रक्रियाओं को लॉन्च करें। उनके पास मूल नामस्थान से डेटा तक केवल पढ़ने के लिए पहुंच होगी। वे मूल नामस्थान से डेटा बदल सकते हैं, लेकिन वे परिवर्तन अन्य प्रक्रियाओं के लिए दृश्यमान नहीं होंगे (मेमोरी मैनेजर स्मृति के प्रत्येक सेगमेंट को कॉपी करेगा जो वे स्थानीय मेमोरी मैप में बदलते हैं)।
अपने अन्य प्रक्रियाओं मूल डाटासेट में परिवर्तन और उन परिवर्तनों को माता-पिता की प्रक्रिया या अन्य प्रक्रियाओं के लिए दृश्यमान बनाना चाहते हैं तो आपको कुछ इस तरह इस्तेमाल कर सकते हैं:
import multiprocessing
import numpy as np
# create your big dataset
big_data = np.zeros((3, 3))
# create a shared-memory wrapper for big_data's underlying data
# (it doesn't matter what datatype we use, and 'c' is easiest)
# I think if lock=True, you get a serialized object, which you don't want.
# Note: you will need to setup your own method to synchronize access to big_data.
buf = multiprocessing.Array('c', big_data.data, lock=False)
# at this point, buf and big_data.data point to the same block of memory,
# (try looking at id(buf[0]) and id(big_data.data[0])) but for some reason
# changes aren't propagated between them unless you do the following:
big_data.data = buf
# now you can update big_data from any process:
def add_one_direct():
big_data[:] = big_data + 1
def add_one(a):
# People say this won't work, since Process() will pickle the argument.
# But in my experience Process() seems to pass the argument via shared
# memory, so it works OK.
a[:] = a+1
print "starting value:"
print big_data
p = multiprocessing.Process(target=add_one_direct)
p.start()
p.join()
print "after add_one_direct():"
print big_data
p = multiprocessing.Process(target=add_one, args=(big_data,))
p.start()
p.join()
print "after add_one():"
print big_data
स्रोत
2016-08-08 20:49:13