নম্পি অ্যারে পাইথন মেমরির ব্যবহার


156

আমি কয়েকটি বড় ফাইল বিশ্লেষণ করার জন্য অজগর ব্যবহার করছি এবং আমি স্মৃতি সংক্রান্ত সমস্যাগুলির মধ্যে চলেছি, তাই আমি ব্যবহারের চেষ্টা করতে এবং ট্র্যাক রাখতে sys.getsizeof () ব্যবহার করছি, তবে অদ্ভুত অ্যারেগুলির সাথে আচরণ করা উদ্ভট। আলবেডোসের মানচিত্রের সাথে জড়িত একটি উদাহরণ যা আমি খুলতে যাচ্ছি:

>>> import numpy as np
>>> import struct
>>> from sys import getsizeof
>>> f = open('Albedo_map.assoc', 'rb')
>>> getsizeof(f)
144
>>> albedo = struct.unpack('%df' % (7200*3600), f.read(7200*3600*4))
>>> getsizeof(albedo)
207360056
>>> albedo = np.array(albedo).reshape(3600,7200)
>>> getsizeof(albedo)
80

ঠিক আছে তথ্য এখনও আছে, কিন্তু বস্তুর আকার, একটি 3600x7200 পিক্সেল মানচিত্র, 200 এমবি থেকে 80 বাইটে চলে গেছে। আমি আশা করতে চাই যে আমার স্মৃতি সংক্রান্ত সমস্যাগুলি শেষ হয়ে গেছে এবং কেবল সমস্ত কিছুকে ন্যালি অ্যারে রূপান্তর করবে, তবে আমি অনুভব করি যে এই আচরণটি যদি সত্য হয় তবে কোনওভাবে তথ্য তত্ত্ব বা থার্মোডিনামিক্সের কিছু আইন লঙ্ঘন করবে, তাই আমি বিশ্বাস করতে ঝোঁক যে getizeof () নাম্বার অ্যারে নিয়ে কাজ করে না। কোন ধারনা?


8
দস্তাবেজগুলি থেকে sys.getsizeof: "বাইটগুলিতে কোনও বস্তুর আকার ফিরিয়ে দিন The বস্তুটি যে কোনও ধরণের অবজেক্ট হতে পারে All সমস্ত অন্তর্নির্মিত বস্তুগুলি সঠিক ফলাফল প্রত্যাবর্তন করবে, তবে তৃতীয় পক্ষের এক্সটেনশানগুলির যেমন আছে তেমন সত্য রাখতে হবে না third বাস্তবায়ন সুনির্দিষ্ট। কেবলমাত্র অবজেক্টের সাথে দায়বদ্ধ মেমোরি খরচ ব্যবহার করা হয়, এটি উল্লেখ করা বস্তুর মেমরির খরচ নয় "
জোয়েল করনেট

1
এটি getsizeofমেমরির গ্রহণের একটি অবিশ্বাস্য সূচক তৈরি করে, বিশেষত তৃতীয় পক্ষের এক্সটেনশনের জন্য।
জোয়েল করনেট

13
মূলত, এখানে সমস্যাটি হ'ল কোনও নতুন অ্যারে নয়, resizeএটি ফিরিয়ে দিচ্ছে view। আপনি আসলের তথ্যটি পেয়ে যাচ্ছেন, আকারের আকার পাচ্ছেন।
মিগিলসন

সেই লক্ষ্যে, sys.getsizeof(albedo.base)অ-দর্শনটির আকার দেবে।
এরিক

উত্তর:


236

আপনি array.nbytesনাম্পার অ্যারেগুলির জন্য ব্যবহার করতে পারেন , উদাহরণস্বরূপ:

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192

এর sys.getsizeof (ক), আমদানি করার পরে sys।
এডিডিস

2
b.__sizeof__()সমতুল্যsys.getsizeof(b)
পলাশ

1
round(getsizeof(a) / 1024 / 1024,2)এমবি পেতে
gies0r

13

ক্ষেত্রের এনবাইটস আপনাকে অ্যারেতে সমস্ত উপাদানগুলির বাইটে আকার দেবে numpy.array:

size_in_bytes = my_numpy_array.nbytes

লক্ষ্য করুন যে এটি "অ্যারে অবজেক্টের অ-উপাদান বৈশিষ্ট্যগুলি" পরিমাপ করে না তাই বাইটে আসল আকারটি এর চেয়ে কয়েক বাইট বেশি হতে পারে।


এই উত্তরটি এখনও একটি অ্যারে তৈরি করে, তাই আমি মনে করি আপনার অর্থ "তালিকা থেকে একটি অ্যারেতে রূপান্তর করার প্রয়োজন ছাড়াই" mean যদিও এটি সত্য যে জিডাব্লুডাব্লু এর উত্তর প্রথমে একটি তালিকা তৈরি করে তারপরে এটি অ্যারেতে রূপান্তরিত করে, এটি ঠিক সেই বিন্দুটির পাশে, যেহেতু ওপিতে ইতিমধ্যে একটি অ্যারে রয়েছে ... বিন্দুটি হল যে কীভাবে একটি অদ্ভুত অ্যারের আকার পাওয়া যায়, তাই এটি নয় কীভাবে আপনি প্রথম স্থানে অ্যারেটি পেয়েছেন তা সমালোচনাপূর্ণ। কেউ এই উত্তরটির অনুরূপ সমালোচনা করতে পারে যে এটি একটি বিদ্যমান অ্যারে পুনরায় আকার দেয়।
মোট

হ্যালো @ মুট, মন্তব্যের জন্য ধন্যবাদ প্রশ্নটি অ্যারের বাইটে কীভাবে আকার পেতে হয় সে সম্পর্কে। যদিও সত্য যে আমার স্নিপেট প্রথমে একটি অ্যারে তৈরি করে, এটি কেবলমাত্র একটি সম্পূর্ণ উদাহরণ থাকার উদ্দেশ্যে যা সম্পাদন করা যায়। আমি আমার উত্তরে এটি সম্পাদন করব edit
এল মার্স

1

পাইথন নোটবুক আমি প্রায়ই ফিল্টার করার জন্য 'আনত' চান numpy.ndarray'র বিশেষ করে বেশী যে সঞ্চিত আছে _1, _2ইত্যাদি যে সত্যিই বোঝানো না হয় জীবিত থাকার।

আমি এই কোডটি তাদের সকলের এবং তাদের আকারের তালিকা পেতে ব্যবহার করি।

এখানে locals()বা globals()আরও ভাল কিনা তা নিশ্চিত নয় ।

import sys
import numpy
from humanize import naturalsize

for size, name in sorted(
    (value.nbytes, name)
    for name, value in locals().items()
    if isinstance(value, numpy.ndarray)):
  print("{:>30}: {:>8}".format(name, naturalsize(size)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.