পাইথনে মেমরির ব্যবহার হ্রাস করা কঠিন, কারণ পাইথন আসলে অপারেটিং সিস্টেমে মেমরিটি ফিরে দেয় না । যদি আপনি অবজেক্টগুলি মুছুন, তবে মেমরিটি নতুন পাইথন অবজেক্টের জন্য উপলব্ধ, তবে free()
সিস্টেমে ফিরে আসবে না ( এই প্রশ্নটি দেখুন )।
যদি আপনি সংখ্যাসূচক অ্যারেগুলিতে আটকে থাকেন তবে সেগুলি মুক্ত হয় তবে বাক্সযুক্ত বস্তুগুলি তা নয়।
>>> import os, psutil, numpy as np
>>> def usage():
... process = psutil.Process(os.getpid())
... return process.get_memory_info()[0] / float(2 ** 20)
...
>>> usage() # initial memory usage
27.5
>>> arr = np.arange(10 ** 8) # create a large array without boxing
>>> usage()
790.46875
>>> del arr
>>> usage()
27.52734375 # numpy just free()'d the array
>>> arr = np.arange(10 ** 8, dtype='O') # create lots of objects
>>> usage()
3135.109375
>>> del arr
>>> usage()
2372.16796875 # numpy frees the array, but python keeps the heap big
ডেটা ফ্রেমের সংখ্যা হ্রাস করা হচ্ছে
পাইথন আমাদের স্মৃতিশক্তিটিকে উচ্চ ওয়াটারমার্কে রাখে তবে আমরা তৈরি ডেটা ফ্রেমের সংখ্যাটি হ্রাস করতে পারি। আপনার ডেটাফ্রেমটি সংশোধন করার সময়, পছন্দ করুন inplace=True
, যাতে আপনি অনুলিপি তৈরি করেন না।
আরেকটি সাধারণ গোচা আইপথনে পূর্বে নির্মিত ডেটাফ্রেমের অনুলিপি ধরে রেখেছে:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'foo': [1,2,3,4]})
In [3]: df + 1
Out[3]:
foo
0 2
1 3
2 4
3 5
In [4]: df + 2
Out[4]:
foo
0 3
1 4
2 5
3 6
In [5]: Out # Still has all our temporary DataFrame objects!
Out[5]:
{3: foo
0 2
1 3
2 4
3 5, 4: foo
0 3
1 4
2 5
3 6}
আপনি %reset Out
আপনার ইতিহাস সাফ করতে টাইপ করে এটি ঠিক করতে পারেন । বিকল্পভাবে, আপনি আইপিথন কতটা ইতিহাস রেখেছেন তা সামঞ্জস্য করতে পারেন ipython --cache-size=5
(ডিফল্টটি 1000)।
ডেটাফ্রেমের আকার হ্রাস করা হচ্ছে
যেখানেই সম্ভব, অবজেক্টের dtyype ব্যবহার এড়িয়ে চলুন।
>>> df.dtypes
foo float64 # 8 bytes per value
bar int64 # 8 bytes per value
baz object # at least 48 bytes per value, often more
একটি অবজেক্ট dtype সহ মানগুলি বাক্সযুক্ত, যার অর্থ নিমপী অ্যারেটিতে কেবলমাত্র একটি পয়েন্টার থাকে এবং আপনার ডেটাফ্রেমের প্রতিটি মানের জন্য স্তূপে একটি পূর্ণ পাইথন অবজেক্ট থাকে। এটি স্ট্রিং অন্তর্ভুক্ত।
যদিও ন্যালি অ্যারেগুলিতে স্থির আকারের স্ট্রিংগুলিকে সমর্থন করে, পান্ডাসগুলি দেয় না ( এটি ব্যবহারকারীর বিভ্রান্তির কারণ )। এটি একটি উল্লেখযোগ্য পার্থক্য করতে পারে:
>>> import numpy as np
>>> arr = np.array(['foo', 'bar', 'baz'])
>>> arr.dtype
dtype('S3')
>>> arr.nbytes
9
>>> import sys; import pandas as pd
>>> s = pd.Series(['foo', 'bar', 'baz'])
dtype('O')
>>> sum(sys.getsizeof(x) for x in s)
120
আপনি স্ট্রিং কলামগুলি ব্যবহার এড়াতে বা স্ট্রিং ডেটা সংখ্যা হিসাবে উপস্থাপনের উপায় খুঁজে পেতে পারেন।
আপনার যদি এমন একটি ডেটাফ্রেম থাকে যাতে অনেকগুলি পুনরাবৃত্তি মান থাকে (NaN খুব সাধারণ) তবে আপনি মেমরির ব্যবহার হ্রাস করতে একটি স্পারস ডেটা কাঠামো ব্যবহার করতে পারেন :
>>> df1.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 39681584 entries, 0 to 39681583
Data columns (total 1 columns):
foo float64
dtypes: float64(1)
memory usage: 605.5 MB
>>> df1.shape
(39681584, 1)
>>> df1.foo.isnull().sum() * 100. / len(df1)
20.628483479893344 # so 20% of values are NaN
>>> df1.to_sparse().info()
<class 'pandas.sparse.frame.SparseDataFrame'>
Int64Index: 39681584 entries, 0 to 39681583
Data columns (total 1 columns):
foo float64
dtypes: float64(1)
memory usage: 543.0 MB
মেমোরি ব্যবহার দেখুন
আপনি মেমোরি ব্যবহার ( ডক্স ) দেখতে পারেন :
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 39681584 entries, 0 to 39681583
Data columns (total 14 columns):
...
dtypes: datetime64[ns](1), float64(8), int64(1), object(4)
memory usage: 4.4+ GB
পান্ডাস 0.17.1 হিসাবে, আপনি df.info(memory_usage='deep')
অবজেক্টস সহ মেমরির ব্যবহার দেখতেও করতে পারেন।
gc
gc.collect()