अद्यतन: संस्करण 0.19.0 के साथ शुरू, get_dummies एक 8 बिट पूर्णांक के बजाय 64 बिट नाव है, जो कई मामलों में इस समस्या को ठीक कर देंगे देता है। देखें: get_dummies -- pandas 0.19.0
यहां प्रयास करने की कुछ संभावनाएं हैं। दोनों डेटाफ्रेम की मेमोरी पदचिह्न को काफी हद तक कम कर देंगे लेकिन आप बाद में स्मृति समस्याओं में भी भाग सकते हैं। भविष्यवाणी करना मुश्किल है, आपको बस कोशिश करनी होगी।
(ध्यान दें कि मैं नीचे info()
के उत्पादन को सरल बनाने रहा हूँ)
df = pd.DataFrame({ 'itemID': np.random.randint(1,4,100) })
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64
memory usage: 3.5 KB
यहाँ हमारे आधारभूत है। प्रत्येक डमी कॉलम 800 बाइट्स लेता है क्योंकि नमूना डेटा में 100 पंक्तियां होती हैं और get_dummies
फ्लोट 64 (8 बाइट्स) के लिए डिफ़ॉल्ट रूप से दिखाई देती है। ऐसा लगता है कि डमी को स्टोर करने के लिए एक अनावश्यक रूप से अक्षम तरीका है क्योंकि आप इसे करने के लिए थोड़ा सा उपयोग कर सकते हैं, लेकिन इसके लिए कुछ कारण हो सकता है जिसके बारे में मुझे पता नहीं है।
तो, पहला प्रयास, प्रत्येक डमी स्तंभ बस (एक एक बाइट पूर्णांक के लिए बदल इस get_dummies
के लिए तो यह astype(np.int8)
के साथ एक रूपांतरण के रूप में किया जा सकता है एक विकल्प हो करने के लिए प्रतीत नहीं होता।
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_').astype(np.int8)],
axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null int8
itemID__2 100 non-null int8
itemID__3 100 non-null int8
memory usage: 1.5 KB
अब तक 1/8 स्मृति के रूप में पहले
वैकल्पिक रूप से लेता है।, आप get_dummies
की sparse
विकल्प का उपयोग कर सकते हैं।
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_',sparse=True)],
axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64
memory usage: 2.0 KB
काफी तुलनात्मक बचत। info()
आउटपुट कुछ हद तक बचत हो रहा है जिस तरह से बचत हो रही है, लेकिन आप कुल बचत को देखने के लिए स्मृति उपयोग के मूल्य को देख सकते हैं।
यह कहना मुश्किल है कि इनमें से कौन सा अभ्यास में बेहतर काम करेगा (यदि कोई भी व्यावहारिक समाधान है), तो आपको बस उन्हें प्रत्येक प्रयास करने की आवश्यकता होगी। सिद्धांत रूप में आप दोनों दृष्टिकोणों को भी जोड़ सकते हैं, लेकिन मैं तब तक कोशिश नहीं करता जब तक कि यह प्रत्येक दृष्टिकोण को अपने आप पर काम न करे।
32-बिट या 64-बिट पायथन? सीमा पायथन कार्यान्वयन के ढेर आकार है, जो वर्चुअल मेमोरी का क्षेत्र है, रैम नहीं। विभिन्न ऑपरेटिंग सिस्टम पर विभिन्न संस्करणों और विभिन्न कार्यान्वयनों में सभी की अलग-अलग सीमाएं होती हैं।जाहिर है आप एक मारा है। क्या आपको उस डेटा को वर्चुअल मेमोरी में एक ही समय में स्टोर करना होगा? – cdarke
मैं 64-बिट पायथन का उपयोग कर रहा हूं। इसका समाधान क्या होगा? कि मैं डेटा सेट को कई हिस्सों में विभाजित करता हूं और उस अलग-अलग हिस्सों पर अपना ऑपरेशन करता हूं? – Duesentrieb
ठीक है, मैं यह सुझाव देने जा रहा था कि यदि आप 32-बिट पर थे। उस स्थिति में आपको अपने डिज़ाइन पर फिर से जाना होगा। – cdarke