2014-04-10 8 views
8

रैम को डेटा में डेटा को स्टोर करने के लिए आवश्यक डिस्क स्थान की तुलना में स्मृति में डेटा को संग्रहीत करने की आवश्यकता कैसे होती है? या कोई सामान्यीकृत सहसंबंध नहीं है?डिस्क पर स्मृति आकार में डेटा आकार

उदाहरण के लिए, कहें कि मेरे पास बस एक अरब फ्लोटिंग पॉइंट मान हैं। बाइनरी रूप में संग्रहीत, जो डिस्क पर 4 बिलियन बाइट या 3.7 जीबी होगा (हेडर और ऐसे सहित)। फिर कहें कि मैंने उन मानों को पायथन में एक सूची में पढ़ा है ... मुझे कितनी रैम की आवश्यकता है?

+0

अधिक रैम! अन्य चीजों के साथ सूची ओवरहेड है। यदि आप चिंतित हैं, ए) पता लगाएं, और बी) केवल मेमोरी में कच्चे डेटा को संग्रहीत करने और इसे फ्लाई पर अनपॅक करने पर विचार करें (यह इस बात पर निर्भर करता है कि आप इसके साथ क्या कर रहे हैं)। – Ryan

+2

संबंधित: http: // stackoverflow।कॉम/ए/994010/846892 –

+0

मेरा पहला विचार यह है कि उपयोगकर्ता को तब तक इंतजार करना पड़ेगा जब तक कि वह डेटा रैम में लोड नहीं हो जाता। –

उत्तर

3

अजगर वस्तु डाटा आकार

डेटा कुछ अजगर वस्तु में संग्रहीत किया जाता है, तो एक छोटे से अधिक स्मृति में वास्तविक डेटा से जुड़ी डेटा हो जाएगा।

यह आसानी से परीक्षण किया जा सकता है।

The size of data in various forms

यह नोट करना कैसे, पहली बार में, अजगर वस्तु की भूमि के ऊपर छोटे डेटा के लिए महत्वपूर्ण है दिलचस्प है, लेकिन जल्दी नगण्य हो जाता है।

यहाँ साजिश

%matplotlib inline 
import random 
import sys 
import array 
import matplotlib.pyplot as plt 

max_doubles = 10000 

raw_size = [] 
array_size = [] 
string_size = [] 
list_size = [] 
set_size = [] 
tuple_size = [] 
size_range = range(max_doubles) 

# test double size 
for n in size_range: 
    double_array = array.array('d', [random.random() for _ in xrange(n)]) 
    double_string = double_array.tostring() 
    double_list = double_array.tolist() 
    double_set = set(double_list) 
    double_tuple = tuple(double_list) 

    raw_size.append(double_array.buffer_info()[1] * double_array.itemsize) 
    array_size.append(sys.getsizeof(double_array)) 
    string_size.append(sys.getsizeof(double_string)) 
    list_size.append(sys.getsizeof(double_list)) 
    set_size.append(sys.getsizeof(double_set)) 
    tuple_size.append(sys.getsizeof(double_tuple)) 

# display 
plt.figure(figsize=(10,8)) 
plt.title('The size of data in various forms', fontsize=20) 
plt.xlabel('Data Size (double, 8 bytes)', fontsize=15) 
plt.ylabel('Memory Size (bytes)', fontsize=15) 
plt.loglog(
    size_range, raw_size, 
    size_range, array_size, 
    size_range, string_size, 
    size_range, list_size, 
    size_range, set_size, 
    size_range, tuple_size 
) 
plt.legend(['Raw (Disk)', 'Array', 'String', 'List', 'Set', 'Tuple'], fontsize=15, loc='best') 
+1

यह उत्तर सही नहीं है। Sys.getsizeof के लिए प्रलेखन में कहा गया है कि "ऑब्जेक्ट को सीधे जिम्मेदार मेमोरी खपत के लिए जिम्मेदार वस्तुओं की स्मृति खपत नहीं है।" इसलिए आपने केवल कंटेनरों में आवंटित स्मृति के लिए जिम्मेदार ठहराया है और संख्या वस्तुओं के लिए आवंटित अतिरिक्त स्मृति पर विचार नहीं किया है। –

+1

क्या आपके पास पूर्ण स्मृति आवंटन को निर्धारित करने के लिए अनुशंसा है? मैं साजिश फिर से कर दूंगा! – tmthydvnprt

+0

मुझे लगता है कि आपको 'सूची', 'सेट' और' tuple' 'के लिए रिपोर्ट किए गए मेमोरी आकार में 'len (double_list) * sys.getsizeof (1.0)' जोड़ने की आवश्यकता है। आवंटन को प्रबंधित करने के लिए शायद कुछ अतिरिक्त मेमोरी की आवश्यकता है, लेकिन मुझे नहीं पता कि इसे कैसे मापें और यह नगण्य होना चाहिए। –

1

एक सादे पायथन सूची में उत्पन्न करने के लिए इस्तेमाल किया IPython कोड है, हर डबल परिशुद्धता संख्या स्मृति के कम से कम 32 बाइट्स की आवश्यकता है, लेकिन केवल 8 बाइट्स वास्तविक स्टोर करने के लिए उपयोग किया जाता है संख्या, बाकी पाइथन की गतिशील प्रकृति का समर्थन करने के लिए आवश्यक है।

नाव CPython में इस्तेमाल वस्तु floatobject.h में परिभाषित किया गया है:

typedef struct { 
    PyObject_HEAD 
    double ob_fval; 
} PyFloatObject; 

जहां PyObject_HEADPyObject struct को a macro that expands है:

typedef struct _object { 
    Py_ssize_t ob_refcnt; 
    struct _typeobject *ob_type; 
} PyObject; 

इसलिए, अजगर दुकानों में हर चल बिन्दु वस्तु दो pointer- आकार के फ़ील्ड (इसलिए प्रत्येक 64-बिट आर्किटेक्चर पर 8 बाइट्स लेता है) 8-बाइट डबल के अलावा, प्रति संख्या 24 बाइट ढेर आवंटित स्मृति प्रदान करता है। यह sys.getsizeof(1.0) == 24 द्वारा पुष्टि की गई है।

इसका मतलब है कि अजगर में n युगल की एक सूची बस संख्या वस्तुओं के लिए संकेत (PyObject*) स्टोर करने के लिए स्मृति के कम से कम 8*n बाइट्स लेता है, और प्रत्येक संख्या वस्तु अतिरिक्त 24 बाइट्स की आवश्यकता है। यह परीक्षण करने के लिए, अजगर आरईपीएल में निम्नलिखित लाइनों चलाने की कोशिश:

>>> import math 
>>> list_of_doubles = [math.sin(x) for x in range(10*1000*1000)] 

और अजगर दुभाषिया की मैमोरी उपयोग देखने (मैं अपने x86-64 कंप्यूटर पर आबंटित स्मृति की लगभग 350 एमबी मिल गया)। ,

>>> list_of_doubles = [1.0 for __ in range(10*1000*1000)] 

तुम सिर्फ लगभग 80 एमबी प्राप्त होगा क्योंकि सूची के सभी तत्वों ही चल बिन्दु संख्या 1.0 का उदाहरण देखें: ध्यान दें कि यदि आप की कोशिश की।

संबंधित मुद्दे