র‍্যামের বাইরে থাকলে কম্পিউটারকে হিমশীতল জুপিটার ল্যাব - কীভাবে এটি প্রতিরোধ করবেন?


12

আমি সম্প্রতি জুপিটার ল্যাব ব্যবহার শুরু করেছি এবং আমার সমস্যাটি হ'ল আমি বেশ বড় ডেটাসেটের সাথে কাজ করি (সাধারণত ডেটাসেট নিজেই প্রায় আমার কম্পিউটারের র্যামের প্রায় 1/4)। নতুন পাইথন অবজেক্ট হিসাবে সংরক্ষিত কয়েকটি রূপান্তরের পরে, আমার স্মৃতিশক্তি চলে যাওয়ার ঝোঁক। সমস্যাটি হ'ল আমি যখন উপলব্ধ র‌্যাম সীমাতে পৌঁছাচ্ছি এবং অন্য কোনও র‌্যাম স্পেসের প্রয়োজন হয় এমন কোনও অপারেশন করবো তখন আমার কম্পিউটার হিমশীতল হয়ে যায় এবং এটি ঠিক করার একমাত্র উপায় হ'ল পুনরায় চালু করা। এটি কি জুপিটার ল্যাব / নোটবুকের কোনও ডিফল্ট আচরণ বা এটি আমার কিছু সেটিংস সেট করা উচিত? সাধারণত, আমি আশা করব প্রোগ্রামটি ক্র্যাশ হয়ে যাবে (উদাহরণস্বরূপ আরস্টুডিওতে), পুরো কম্পিউটারটি নয়


আমার আগেও একই সমস্যা ছিল, এটা আসলেই বাজে। আমি জুপিটার সম্পর্কিত বিষয়গুলিতে তাত্ক্ষণিকভাবে নজর রেখেছি এবং কিছুই পাইনি। আপনি আইপিথন (প্লেইন পাইথন নয়) কনসোল দিয়ে চালালেও কি এটি ঘটবে?
BZazz

আপনি কোন প্যাকেজ / মডিউল ব্যবহার করেছেন? এটি কি ওএস? তোমার কি অদলবদল হয়েছে? জুপিটার ল্যাবের কোন সংস্করণ? যদি এটি লিনাক্সের কর্নেল সংস্করণ ছিল?
নিজাম মোহাম্মদ

এটি বেশিরভাগ পান্ডাস, তবে আমি মনে করি না এটি প্যাকেজ সম্পর্কিত। ওএস হ'ল উবুন্টু 16.04.6 এলটিএস এবং কার্নেল সংস্করণটি 4.15.0-65-জেনেরিক। জুপিটার ল্যাব সংস্করণটি 1.0.2। আমার কাছে 12 গিগাবাইটের জন্য একটি সোয়্যাপ সেট রয়েছে (2 টি ফাইলের জন্য বরাদ্দ করা হয়েছে) যা আমার র‌্যামের 1.5 টি।
জ্যাকস 24:39

উত্তর:


5

অবশ্যই এই সমস্যার সর্বাধিক শক্তিশালী সমাধান হ'ল ডকার পাত্রে ব্যবহার করা। জুপিটারে কত মেমরি বরাদ্দ করতে হবে তা আপনি নির্দিষ্ট করতে পারেন এবং যদি ধারকটি মেমরির বাইরে চলে যায় তবে এটি কোনও বড় বিষয় নয় (কেবল ঘন ঘন সংরক্ষণ করা মনে রাখবেন, তবে তা বলার অপেক্ষা রাখে না)।

এই ব্লগটি আপনাকে সেখানে বেশিরভাগ পথে পাবে। অবাধে উপলভ্য, সরকারীভাবে রক্ষণাবেক্ষণ করা, বৃহস্পতি চিত্রগুলি থেকে এখানে জপিটার ল্যাব স্থাপনের জন্য কিছু শালীন নির্দেশাবলী রয়েছে:

https://medium.com/fundbox-engineering/overview-d3759e83969c

এবং তারপরে আপনি docker runটিউটোরিয়ালে বর্ণিত কমান্ডটি সংশোধন করতে পারেন (যেমন 3 গিগাবাইটের জন্য):

docker run --memory 3g <other docker run args from tutorial here>

ডকার মেমরি বিকল্পগুলিতে সিনট্যাক্সের জন্য, এই প্রশ্নটি দেখুন:

ডকার "- মেমোরি" বিকল্পটি কোন ইউনিটের প্রত্যাশা করে?


4

আপনি যদি উবুন্টু ব্যবহার করেন তবে ওওএম খুনিদের পরীক্ষা করে দেখুন, আপনি এখান থেকে তথ্য পেতে পারেন

আপনি প্রাথমিক ব্যবহার করতে পারেন । এটি আপনার ইচ্ছা অনুসারে কনফিগার করা যেতে পারে, উদাহরণস্বরূপ earlyoom -s 90 -m 15শুরু হবে earlyoomএবং যখন অদলবদলের আকার% 90 এর চেয়ে কম হবে এবং মেমরিটি% 15 এর চেয়ে কম হবে, এটি OOM এর কারণ হতে পারে এবং পুরো সিস্টেমটিকে হিমায়িত করতে বাধা দেয়। আপনি প্রক্রিয়াগুলির অগ্রাধিকারটিও কনফিগার করতে পারেন।


2

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

যেমন

df = pd.read('some_giant_dataframe') # or whatever your import is
new_df = my_transform(df)
del df # if unneeded.

জ্যাকসগুলি আপনি বড় ডেটা ওয়ার্কফ্লোগুলিতে এই থ্রেডকেও সহায়ক বলে মনে করতে পারেন। আমি মেমরির সঞ্চয়স্থানে সহায়তা করার জন্য ডাস্কের দিকে নজর রেখেছি ।

আমি স্পাইডার এবং জুপাইটারে লক্ষ্য করেছি যে একটি বৃহত মেমরি কনসোল চলাকালীন অন্য কনসোলে কাজ করার সময় ফ্রিজআপটি সাধারণত ঘটবে। কেন এটি ক্র্যাশ না হয়ে কেবল স্থির হয়ে যায়, আমি মনে করি এটির কার্নেলের সাথে কিছু করার আছে। আইপিথন গিথুবে কয়েকটি মেমরি সমস্যা খোলা রয়েছে - # 10082 এবং # 10117 সবচেয়ে প্রাসঙ্গিক বলে মনে হচ্ছে। এখানে একজন ব্যবহারকারী jediজেডি তে ট্যাব সমাপ্তি অক্ষম করার বা আপডেট করার পরামর্শ দিচ্ছেন ।

10117 এ তারা এর আউটপুট চেক করার প্রস্তাব দেয় get_ipython().history_manager.db_log_output। আমার একই সমস্যা রয়েছে এবং আমার সেটিংটি সঠিক, তবে এটি চেক করার মতো


1

আপনি ক্লাউডে নোটবুকও ব্যবহার করতে পারেন, যেমন গুগল কোলাব এখানে । তারা প্রস্তাবিত র‌্যামগুলির জন্য সুবিধা সরবরাহ করেছে এবং জুপিটার নোটবুকের জন্য ডিফল্ট সমর্থন support


0

আমার মনে হয় আপনার খণ্ডগুলি ব্যবহার করা উচিত। সে রকমই:

df_chunk = pd.read_csv(r'../input/data.csv', chunksize=1000000)
chunk_list = []  # append each chunk df here 

# Each chunk is in df format
for chunk in df_chunk:  
    # perform data filtering 
    chunk_filter = chunk_preprocessing(chunk)

    # Once the data filtering is done, append the chunk to list
    chunk_list.append(chunk_filter)

# concat the list into dataframe 
df_concat = pd.concat(chunk_list)

আরও তথ্যের জন্য এটি পরীক্ষা করে দেখুন: https : //towardsdatasज्ञान.com / why-and-how-to-use-pandas-with-large-data-9594dda2ea4c

আমি প্রস্তাব দিচ্ছি যে আবার কোনও তালিকা সংযোজন করবেন না (সম্ভবত র্যাম আবার ওভারলোড হবে)। লুপের জন্য আপনার নিজের কাজটি শেষ করা উচিত।


আমি মনে করি যে এখানে সমস্যাটি কীভাবে মেমরি ফুরিয়ে যায় না, তবে কীভাবে কম্পিউটারে ক্রাশ হওয়া এবং পুনরায় আরম্ভ করার প্রয়োজন হয় তা এড়ানো যায় না। পাইথনের ক্রাশ বা স্মৃতিচিহ্ন ছুঁড়ে ফেলা উচিত, তবে সবকিছু গোলমাল করবেন না।
BZazz

0

আমি নীচের প্রশ্ন থেকে উত্তর সংক্ষেপে যাচ্ছি । আপনি আপনার প্রোগ্রামের মেমরির ব্যবহার সীমিত করতে পারেন। নীচে এই ফাংশন হবে ram_intense_foo()। কল করার আগে আপনাকে ফাংশনটি কল করতে হবেlimit_memory(10)

import resource
import platform
import sys
import numpy as np 

def memory_limit(percent_of_free):
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024 * percent_of_free / 100, hard))

def get_memory():
    with open('/proc/meminfo', 'r') as mem:
        free_memory = 0
        for i in mem:
            sline = i.split()
            if str(sline[0]) == 'MemAvailable:':
                free_memory = int(sline[1])
                break
    return free_memory

def ram_intense_foo(a,b):
    A = np.random.rand(a,b)
    return A.T@A

if __name__ == '__main__':
    memory_limit(95)
    try:
        temp = ram_intense_foo(4000,10000)
        print(temp.shape)
    except MemoryError:
        sys.stderr.write('\n\nERROR: Memory Exception\n')
        sys.exit(1)

-4

বড় ডেটা ফ্রেমের পুরো আউটপুট দেখার কোনও কারণ নেই। বড় ডেটা ফ্রেমগুলি দেখতে বা পরিচালনা করতে অকারণে আপনার কম্পিউটার সংস্থানগুলির বৃহত পরিমাণ ব্যবহার করবে।

আপনি যা করছেন তা ক্ষুদ্রায়ণে করা যেতে পারে। ডেটা ফ্রেম যখন ছোট হয় তখন ডেটা কোডিং এবং ম্যানিপুলেট করার পক্ষে কাজ করা আরও সহজ। বড় ডেটা নিয়ে কাজ করার সর্বোত্তম উপায় হ'ল একটি নতুন ডেটা ফ্রেম তৈরি করা যা কেবলমাত্র ছোট অংশ বা বৃহত ডেটা ফ্রেমের একটি ছোট নমুনা নেয়। তারপরে আপনি ডেটা অন্বেষণ করতে পারেন এবং ছোট কোড ফ্রেমে আপনার কোডিং করতে পারেন। একবার আপনি ডেটা অন্বেষণ করে এবং আপনার কোডটি কাজ করে নিলে, কেবলমাত্র সেই কোডটি বৃহত্তর ডেটা ফ্রেমে ব্যবহার করুন।

সবচেয়ে সহজ উপায় হ'ল হেড () ফাংশনটি ব্যবহার করে ডেটা ফ্রেম থেকে প্রথম সারির প্রথম এন সংখ্যাটি নেওয়া সহজ। মাথা ফাংশনটি কেবল এন, সারিগুলির সংখ্যা মুদ্রণ করে। আপনি বড় ডেটা ফ্রেমে হেড ফাংশনটি ব্যবহার করে একটি মিনি ডেটা ফ্রেম তৈরি করতে পারেন। নীচে আমি প্রথম 50 টি সারি নির্বাচন করতে এবং তাদের মানটি ছোট_ডিএফ-তে নির্বাচন করার জন্য বেছে নিয়েছি। এটি ধরে নিয়েছে বিগডাটা হ'ল একটি ডেটা ফাইল যা আপনার এই প্রকল্পের জন্য খোলার লাইব্রেরি থেকে আসে।

library(namedPackage) 

df <- data.frame(BigData)                #  Assign big data to df
small_df <- head(df, 50)         #  Assign the first 50 rows to small_df

এটি বেশিরভাগ সময় কাজ করবে, তবে কখনও কখনও বড় ডেটা ফ্রেমটি পূর্বনির্ধারিত ভেরিয়েবলগুলির সাথে বা ইতিমধ্যে গোষ্ঠীযুক্ত ভেরিয়েবলগুলির সাথে আসে। বড় ডেটা যদি এমন হয় তবে বড় ডেটা থেকে আপনার সারিগুলির একটি এলোমেলো নমুনা নেওয়া দরকার। তারপরে নিম্নলিখিত কোডটি ব্যবহার করুন:

df <- data.frame(BigData)

set.seed(1016)                                          # set your own seed

df_small <- df[sample(nrow(df),replace=F,size=.03*nrow(df)),]     # samples 3% rows
df_small                                                         # much smaller df
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.