पायथन और न्यूमपी का उपयोग करते हुए बहुत बड़े मैट्रिसेस


86

NumPy एक अत्यंत उपयोगी पुस्तकालय है, और इसका उपयोग करने से मैंने पाया है कि यह उन मैट्रिसेस को संभालने में सक्षम है जो काफी बड़े (10000 x 10000) आसानी से हैं, लेकिन कुछ भी बड़े से संघर्ष करना शुरू कर देता है (50000 x 50000 का एक मैट्रिक्स बनाने की कोशिश कर रहा है) विफल रहता है)। जाहिर है, यह बड़े पैमाने पर स्मृति आवश्यकताओं के कारण है।

क्या NumPy (1 मिलियन बाय 1 मिलियन) को मूल रूप से विशाल मैट्रीस बनाने का एक तरीका है (किसी भी प्रकार के रैम के कई टेराबाइट्स के बिना)?

जवाबों:


91

PyTables और NumPy जाने का रास्ता है।

PyTables डिस्क को HDF प्रारूप में वैकल्पिक संपीड़न के साथ संग्रहीत करेगा। मेरे डेटासेट में अक्सर 10x संपीड़न होता है, जो दसियों या सैकड़ों लाखों पंक्तियों के साथ काम करते समय काम आता है। यह भी बहुत तेज है; मेरा 5 साल पुराना लैपटॉप 1,000,000 पंक्तियों / सेकंड में एसक्यूएल-जैसे ग्रुप बाय एग्रीगेशन द्वारा डेटा के माध्यम से क्रंच कर सकता है। पायथन-आधारित समाधान के लिए बुरा नहीं है!

NumPy के रूप में डेटा को फिर से एक्सेस करना उतना ही सरल है:

data = table[row_from:row_to]

HDF लाइब्रेरी डेटा की प्रासंगिक मात्रा में पढ़ने और NumPy में परिवर्तित होने का ध्यान रखती है।


4
तो आपको अभी भी डेटा को प्रसंस्करण के लिए अपने आप को विखंडित करना होगा? यह डिस्क फ़ाइलों को और उससे रूपांतरण को सरल बनाने का एक तरीका है?
एंडोलिथ

कोई भी मौका आप अपने उत्तर को थोड़ा और स्पष्टता और कुछ उदाहरणों के साथ बढ़ा सकते हैं?
एडम बी

56

numpy.arrays स्मृति में रहने के लिए होते हैं। यदि आप अपने रैम से बड़े मेट्रिसेस के साथ काम करना चाहते हैं, तो आपको उसके आसपास काम करना होगा। कम से कम दो दृष्टिकोण हैं जिनका आप अनुसरण कर सकते हैं:

  1. एक अधिक कुशल मैट्रिक्स प्रतिनिधित्व का प्रयास करें जो आपके मैट्रिसेस के किसी विशेष संरचना का शोषण करता है। उदाहरण के लिए, जैसा कि अन्य पहले ही बता चुके हैं, विरल मैट्रिसेस (बहुत सारे शून्य के साथ मैट्रिस) के लिए कुशल डेटा संरचनाएं हैं, जैसेscipy.sparse.csc_matrix
  2. अपने एल्गोरिथ्म को उपमात्राओं पर काम करने के लिए संशोधित करें । आप डिस्क से केवल मैट्रिक्स ब्लॉक पढ़ सकते हैं जो वर्तमान में कम्प्यूटेशन में उपयोग किया जा रहा है। क्लस्टर्स पर चलने के लिए डिज़ाइन किए गए एल्गोरिदम आमतौर पर ब्लॉकवाइज काम करते हैं, क्योंकि डेटा विभिन्न कंप्यूटरों में स्कैट किया जाता है, और केवल तब ही पास किया जाता है जब जरूरत होती है। उदाहरण के लिए, मैट्रिक्स गुणा (पीडीएफ फाइल) के लिए फॉक्स एल्गोरिथ्म

4
3- बिग डेटा प्रतिमान और स्टेप-इन-सॉल्यूशन जैसे मेप्रेड्यूस
मेडिएरोस

नंबर 2 के लिए, आप यह कैसे तय करते हैं कि आपका हिस्सा कितना बड़ा है? क्या मुफ्त मेमोरी की मात्रा को मापने और उसके आधार पर अपनी विखंडू को आकार देने का एक तरीका है?
एंडोलिथ

30

आपको डिस्क पर किसी फ़ाइल को मेमोरी मैप करने के लिए numpy.memmap का उपयोग करने में सक्षम होना चाहिए। नए अजगर और 64-बिट मशीन के साथ, आपके पास आवश्यक पता स्थान होना चाहिए, सब कुछ मेमोरी में लोड किए बिना। OS को केवल फ़ाइल का हिस्सा मेमोरी में रखना चाहिए।


18
क्या आप कुछ ऐसा करने के लिए इसका उपयोग कर सकते हैं जो स्मृति में फिट नहीं हो सकता है?
एंडोलिथ

24

विरल मैट्रिस को संभालने के लिए, आपको उस scipyपैकेज की आवश्यकता होती है जो सबसे ऊपर बैठता है numpy- स्पार्स-मैट्रिक्स विकल्पों के बारे में अधिक जानकारी के लिए यहां देखें जो scipyआपको देता है।


11

स्टेफानो बोरीनी की पोस्ट मुझे इस बात पर गौर करने के लिए मिली कि इस तरह की चीज़ कितनी दूर है।

यह बात है। यह मूल रूप से वही करना प्रतीत होता है जो आप चाहते हैं। HDF5 आपको बहुत बड़े डेटासेट स्टोर करने देगा, और फिर उन्हें उसी तरह से एक्सेस और उपयोग करेगा जैसे कि NumPy करता है।


9
एक बेहतर विकल्प PyTables हो सकता है। यह कोर HDF5 कार्यक्षमता की तुलना में उच्च स्तर है (H5Py पायथन से सुलभ निम्न-स्तरीय एपीआई से थोड़ा अधिक है)। इसके अलावा पिछले सप्ताह के 2.2 बीटा में इस समस्या के लिए उपकरण हैं: pytables.org/moin/ReleaseNotes/Release_2.2b1 जोड़ा गया एक्सप्र , एक वर्ग [कि] भावों का मूल्यांकन कर सकता है (जैसे '3 * a + 4 * b' जो मनमाने बड़े पर काम करता है संसाधनों का अनुकूलन करते समय सरणियाँ [...]। यह Numexpr पैकेज के समान है, लेकिन NumPy ऑब्जेक्ट्स के अलावा, यह डिस्क-आधारित सजातीय सरणियों को भी स्वीकार करता है, जैसे Array, CArray, EArray और Column PyTables ऑब्जेक्ट।
AFoglia

5

सुनिश्चित करें कि आप 64-बिट ऑपरेटिंग सिस्टम और Python / NumPy के 64-बिट संस्करण का उपयोग कर रहे हैं। ध्यान दें कि 32-बिट आर्किटेक्चर पर आप आम तौर पर 3GB मेमोरी (लगभग 1GB मेमोरी मैप्ड आई / ओ और इस तरह खो सकते हैं) को संबोधित कर सकते हैं।

64-बिट और चीजें उपलब्ध रैम से बड़ी होने के कारण आप वर्चुअल मेमोरी से दूर हो सकते हैं, हालांकि अगर आपको स्वैप करना है तो चीजें धीमी हो जाएंगी। इसके अलावा, मेमोरी मैप्स (numpy.memmap देखें) मेमोरी पर लोड किए बिना डिस्क पर बड़ी फ़ाइलों के साथ काम करने का एक तरीका है, लेकिन फिर, आपको इसके लिए काम करने के लिए 64-बिट एड्रेस स्पेस होना चाहिए। PyTables आप के लिए भी यह सबसे ज्यादा करेगा।



4

कभी-कभी एक सरल समाधान आपके मैट्रिक्स आइटम के लिए एक कस्टम प्रकार का उपयोग कर रहा है। आपके द्वारा आवश्यक संख्याओं के आधार पर, आप dtypeअपने आइटमों के लिए मैन्युअल और विशेष रूप से छोटे का उपयोग कर सकते हैं । क्योंकि Numpy डिफ़ॉल्ट रूप से ऑब्जेक्ट के लिए सबसे बड़ा प्रकार मानता है, यह कई मामलों में एक उपयोगी विचार हो सकता है। यहाँ एक उदाहरण है:

In [70]: a = np.arange(5)

In [71]: a[0].dtype
Out[71]: dtype('int64')

In [72]: a.nbytes
Out[72]: 40

In [73]: a = np.arange(0, 2, 0.5)

In [74]: a[0].dtype
Out[74]: dtype('float64')

In [75]: a.nbytes
Out[75]: 32

और कस्टम प्रकार के साथ:

In [80]: a = np.arange(5, dtype=np.int8)

In [81]: a.nbytes
Out[81]: 5

In [76]: a = np.arange(0, 2, 0.5, dtype=np.float16)

In [78]: a.nbytes
Out[78]: 8

3

क्या आप पूछ रहे हैं कि टेराबाइट रैम के बिना 2,500,000,000 एलिमेंट मैट्रिक्स को कैसे हैंडल किया जाए?

8 बिलियन बाइट की रैम के बिना 2 बिलियन आइटम को संभालने का तरीका मैट्रिक्स को मेमोरी में न रखकर है।

इसका मतलब है कि टुकड़ों में फ़ाइल सिस्टम से इसे लाने के लिए बहुत अधिक परिष्कृत एल्गोरिदम हैं।


7
सच नहीं। यदि तत्वों का 99.99% (एक यथार्थवादी उदाहरण के लिए) शून्य है, तो मैट्रिक्स के सभी डेटा को स्मृति में रखा जा सकता है। हर शून्य के लिए 4 बाइट्स का उपयोग करने की आवश्यकता नहीं है, जब आप केवल (row, column, value)उन प्रविष्टियों की सूची संग्रहीत कर सकते हैं जो मौजूद हैं।
एरिक विल्सन

6
@ EricWilson: प्रश्न में यह मैट्रिक्स के विरल होने का सुझाव कहाँ दिया गया था? मैं पूरी तरह से चूक गया। क्या आप उद्धरण प्रदान कर सकते हैं?
एस.लॉट

1

आमतौर पर जब हम बड़े मैट्रिसेस से निपटते हैं तो हम उन्हें स्पार्स मैट्रिसेस के रूप में लागू करते हैं

मुझे नहीं पता कि क्या सुपाच्य विरल मैट्रिस का समर्थन करता है लेकिन मुझे इसके बजाय यह मिला ।


1

जहां तक ​​मुझे सुन्न के बारे में पता है, नहीं, लेकिन मैं गलत हो सकता है।

मैं आपको इस वैकल्पिक समाधान का प्रस्ताव कर सकता हूं: डिस्क पर मैट्रिक्स लिखें और इसे चंक्स में एक्सेस करें। मैं आपको एचडीएफ 5 फ़ाइल प्रारूप का सुझाव देता हूं। यदि आपको पारदर्शी रूप से इसकी आवश्यकता है, तो आप अपने डिस्क-संग्रहित मैट्रिक्स को मेमोरी में paginate करने के लिए ndarray इंटरफ़ेस को फिर से लागू कर सकते हैं। यदि आप डेटा को डिस्क पर वापस सिंक करने के लिए संशोधित करते हैं तो सावधान रहें।


क्या होगा यदि मैं 57600 द्वारा 57600 के पूरे मैट्रिक्स का उपयोग करना चाहता हूं?
गुंजन नाइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.