পাইথনের সাথে একটি বিশাল সিএসভি প্রক্রিয়াজাতকরণ হঠাৎ বন্ধ হয়ে গেলে 'হত্যা' বলতে কী বোঝায়?


93

আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা একটি বৃহত সিএসভি ফাইল আমদানি করে এবং তারপরে ফাইলের প্রতিটি শব্দের সংখ্যার সংখ্যা গণনা করে তারপরে অন্য একটি সিএসভি ফাইলে গণনা রফতানি করে।

তবে যা হচ্ছে তা হ'ল একবার গণনার অংশ শেষ হয়ে যায় এবং রফতানি শুরু হয় এটি Killedটার্মিনালে বলে।

আমি মনে করি না এটি একটি স্মৃতি সমস্যা (এটি যদি আমি ধরে নিই যে আমি একটি স্মৃতি ত্রুটি পেয়ে যাব এবং না Killed)।

প্রক্রিয়াটি খুব বেশি সময় নিচ্ছে তা কি হতে পারে? যদি তাই হয়, সময়-সময়কাল বাড়ানোর কোনও উপায় আছে যাতে আমি এড়াতে পারি?

কোডটি এখানে:

csv.field_size_limit(sys.maxsize)
    counter={}
    with open("/home/alex/Documents/version2/cooccur_list.csv",'rb') as file_name:
        reader=csv.reader(file_name)
        for row in reader:
            if len(row)>1:
                pair=row[0]+' '+row[1]
                if pair in counter:
                    counter[pair]+=1
                else:
                    counter[pair]=1
    print 'finished counting'
    writer = csv.writer(open('/home/alex/Documents/version2/dict.csv', 'wb'))
    for key, value in counter.items():
        writer.writerow([key, value])

এবং Killedপরে finished countingমুদ্রণ করা হবে এবং পুরো বার্তাটি হ'ল:

killed (program exited with code: 137)

6
আপনি যে ত্রুটি বার্তাটি পাচ্ছেন তার সঠিক শব্দটি পোস্ট করুন।
রবার্ট হার্ভে

4
"নিহত" বলতে সাধারণত বোঝায় যে প্রক্রিয়াটি এমন কিছু সিগন্যাল পেয়েছিল যা এটি প্রস্থান করার কারণ হতে পারে। এই ক্ষেত্রে যেহেতু এটি স্ক্রিপ্টের একই সময়ে ঘটছে এটির একটি ভাঙা পাইপ হওয়ার খুব ভাল সম্ভাবনা রয়েছে, তাই প্রক্রিয়াটি অন্য প্রান্তে বন্ধ হওয়া কোনও ফাইল হ্যান্ডেল থেকে পড়তে বা লেখার চেষ্টা করছে।
অ্যান্ড্রু ক্লার্ক

4
এটি killedবার্তাটি কোথা থেকে এসেছে সে সম্পর্কে কোনও উত্তর নয় , তবে এটি যদি কোনও ধরণের সিস্টেমের মেমরির সীমা ছাড়িয়ে যাওয়ার কারণে হয় তবে আপনি আপনার চূড়ান্ত লুপের counter.iteritems()পরিবর্তে এটি ব্যবহার করতে পারেন counter.items()। পাইথন 2-এ, itemsঅভিধানে কী এবং মানগুলির একটি তালিকা প্রদান করে, এটি খুব বড় হলে প্রচুর মেমরির প্রয়োজন হতে পারে। বিপরীতে, iteritemsএমন একটি জেনারেটর যা কোনও নির্দিষ্ট সময়ে কেবল অল্প পরিমাণ মেমরির প্রয়োজন।
ব্ল্যাককিংহিট

উত্তর:


103

প্রস্থান কোড 137 (128 + 9) ইঙ্গিত দেয় যে আপনার প্রোগ্রামটি 9 সংকেত প্রাপ্তির কারণে প্রস্থান করেছে যা এটি SIGKILL। এটি killedবার্তাটিও ব্যাখ্যা করে । প্রশ্নটি হল, আপনি কেন এই সংকেতটি পেলেন?

সম্ভবত সম্ভাব্য কারণ সম্ভবত আপনার প্রক্রিয়া আপনাকে ব্যবহার করার অনুমতিপ্রাপ্ত সিস্টেম সংস্থানগুলির পরিমাণের কিছু সীমা অতিক্রম করেছে। আপনার ওএস এবং কনফিগারেশনের উপর নির্ভর করে এর অর্থ এই হতে পারে যে আপনার কাছে অনেকগুলি খোলার ফাইল রয়েছে, খুব বেশি ফাইলসাইম স্পেস বা অন্য কিছু ব্যবহার করা হয়েছে। সম্ভবত আপনার প্রোগ্রামটি খুব বেশি মেমরি ব্যবহার করছে। মেমরির বরাদ্দ ব্যর্থ হওয়া শুরু হওয়ার পরে সিস্টেমগুলি ভাঙার ঝুঁকির চেয়ে, প্রক্রিয়াটিতে একটি কিল সংকেত প্রেরণ করা হয়েছিল যা অত্যধিক মেমরি ব্যবহার করে।

আমি আগে মন্তব্য করেছি, একটি কারণ আপনি মুদ্রণের পরে একটি মেমরি সীমাতে আঘাত করতে পারে finished countingcounter.items() আপনার চূড়ান্ত লুপে আপনার কলটি একটি অভিধান বরাদ্দ করে যা আপনার অভিধান থেকে সমস্ত কী এবং মান রয়েছে। যদি আপনার অভিধানটিতে প্রচুর ডেটা থাকে তবে এটি খুব বড় তালিকা হতে পারে। একটি সম্ভাব্য সমাধান counter.iteritems()হ'ল এটি ব্যবহার করা যা জেনারেটর। তালিকার সমস্ত আইটেম ফিরিয়ে দেওয়ার পরিবর্তে এটি আপনাকে কম মেমরির ব্যবহারের মাধ্যমে পুনরাবৃত্তি করতে দেয়।

সুতরাং, আমি আপনার চূড়ান্ত লুপ হিসাবে এটি চেষ্টা করার পরামর্শ দেব:

for key, value in counter.iteritems():
    writer.writerow([key, value])

দ্রষ্টব্য যে পাইথন 3 এ, itemsএকটি "অভিধানের দর্শন" অবজেক্টটি দেয় যা পাইথন 2 এর সংস্করণের মতো ওভারহেড নেই। এটি প্রতিস্থাপন করে iteritems, সুতরাং যদি আপনি পরে পাইথন সংস্করণগুলি আপগ্রেড করেন তবে আপনি লুপটি ঠিক সেইভাবে পরিবর্তন করবেন।


4
সঠিক, তবে অভিধান নিজেই অনেক স্মৃতি গ্রহণ করবে। ওপি'র একবারে সবার পরিবর্তে ফাইলটি পড়া এবং প্রসেসিংয়ের বিষয়টি বিবেচনা করা উচিত।
কেভিন

24

দুটি স্টোরেজ ক্ষেত্র জড়িত রয়েছে: স্ট্যাক এবং হিপ st স্ট্যাকটি যেখানে কোনও মেথড কলের বর্তমান অবস্থা (যেমন স্থানীয় ভেরিয়েবল এবং রেফারেন্স) রাখা হয়, এবং হিপটি যেখানে বস্তুগুলি সংরক্ষণ করা হয়। পুনরাবৃত্তি এবং স্মৃতি

আমি অনুমান করি যে ডিকটিতে অনেকগুলি কী counterরয়েছে যা হিপ অঞ্চলের অত্যধিক স্মৃতি গ্রহণ করবে, তাই পাইথন রানটাইম একটি আউটআফমেমরি ব্যতিক্রম বাড়িয়ে তুলবে

এটি সংরক্ষণ করতে, কোনও দৈত্য বস্তু যেমন কাউন্টার তৈরি করবেন না ।

1. স্টক ওভারফ্লো

এমন একটি প্রোগ্রাম যা অনেকগুলি স্থানীয় ভেরিয়েবল তৈরি করে।

Python 2.7.9 (default, Mar  1 2015, 12:57:24) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('stack_overflow.py','w')
>>> f.write('def foo():\n')
>>> for x in xrange(10000000):
...   f.write('\tx%d = %d\n' % (x, x))
... 
>>> f.write('foo()')
>>> f.close()
>>> execfile('stack_overflow.py')
Killed

2.আউটঅফমেমরি

একটি প্রোগ্রাম যা দৈত্য তৈরি করে তার dictমধ্যে অনেকগুলি কী থাকে।

>>> f = open('out_of_memory.py','w')
>>> f.write('def foo():\n')
>>> f.write('\tcounter = {}\n')
>>> for x in xrange(10000000):
...   f.write('counter[%d] = %d\n' % (x, x))
... 
>>> f.write('foo()\n')
>>> f.close()
>>> execfile('out_of_memory.py')
Killed

তথ্যসূত্র

4

সম্ভবত, আপনি স্মৃতিশক্তি হারিয়েছেন, তাই কার্নেল আপনার প্রক্রিয়াটি মেরে ফেলেছে।

আপনি কি ওওএম খুনির কথা শুনেছেন ?

CSV ফাইলগুলি থেকে বিশাল আকারের ডেটা প্রক্রিয়াকরণের জন্য আমি যে স্ক্রিপ্ট থেকে তৈরি করেছি তা এখানে রয়েছে:

Mar 12 18:20:38 server.com kernel: [63802.396693] Out of memory: Kill process 12216 (python3) score 915 or sacrifice child
Mar 12 18:20:38 server.com kernel: [63802.402542] Killed process 12216 (python3) total-vm:9695784kB, anon-rss:7623168kB, file-rss:4kB, shmem-rss:0kB
Mar 12 18:20:38 server.com kernel: [63803.002121] oom_reaper: reaped process 12216 (python3), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

এটি নেওয়া হয়েছিল /var/log/syslog

মূলত:

PID, 12216 একটি নির্বাচিত শিকার (মোট-VM- র + + 9Gb ব্যবহারে কারণে), তাই oom_killer এটা reaped।

ওওএম আচরণ সম্পর্কে একটি নিবন্ধ এখানে ।


4
+1, কেবল স্পষ্ট করে বলতে, আমার প্রোগ্রামটি কতটা র‌্যাম ব্যবহার করার চেষ্টা করছে তা বোঝার জন্য, আমি কি মোট-ভিএম, আনন-আরএস, ফাইল-আরএসএসের মান যুক্ত করব? এছাড়াও এবং মোট-ভিএম দেয় যে আমার প্রোগ্রামটি কতটা ব্যবহার করছে এবং প্রকৃত উপলব্ধ মেমরিটি নয়, তাই না? দুঃখিত, জ্ঞান সীমিত।
মোমো

4
আমার জ্ঞান এই প্রসঙ্গেও সীমাবদ্ধ, @ মোমো। আরও তদন্তের জন্য আমি কিছুটা সময় অতিক্রম করছি, তবে আমি এই পোস্টটি পেয়েছি যা সহায়তা করতে পারে: stackoverflow.com/questions/18845857/… । আমি আপনাকে যা বলতে পারি, তা কি প্রকৃতপক্ষে মোট-ভিএম, প্রক্রিয়া দ্বারা ব্যবহৃত মেমরির পরিমাণ।
ivanleoncz

3

আমি সন্দেহ করি যে কোনও কিছু প্রক্রিয়াটি হারাচ্ছে কারণ এটি দীর্ঘ সময় নেয়। সাধারণভাবে নিহত হওয়ার অর্থ বাইরে থেকে কিছু প্রক্রিয়াটি বন্ধ হয়ে যায় তবে সম্ভবত এটি ক্ষেত্রে সিটিআরএল-সিটিকে আঘাত করা নয় কারণ এর ফলে পাইথনকে কী-বোর্ড আন্তঃবিধ ব্যতিক্রম থেকে বেরিয়ে আসতে হবে। এছাড়াও, পাইথন-এ যদি সমস্যা হয় তবে আপনি মেমোরিরর ব্যতিক্রম পাবেন। যা ঘটতে পারে তা হ'ল আপনি পাইথন বা স্ট্যান্ডার্ড লাইব্রেরি কোডে একটি বাগ চাপছেন যা প্রক্রিয়াটির ক্র্যাশ ঘটায়।


ক্র্যাশিং বাগের ফলে সেগফোল্ট হওয়ার চেয়ে অনেক বেশি সম্ভাবনা থাকে SIGKILL, যদি পাইথনের raise(SIGKILL)কোনও কারণে কোনও কোডে কোথাও না থাকে।
কেভিন

4
পাইথনের একটি বাগ সিগ্কিল প্রেরণ করবে না।
qwr

1

VirtualBoxনতুন উবুন্টু ২০.০৪ এলটিএসের মধ্যে একটি ভাগ করা ফোল্ডার থেকে পাইথন স্ক্রিপ্টটি চালানোর চেষ্টা করার সময় আমার সাথে একই ঘটনা ঘটেছিল । Killedআমার নিজের ব্যক্তিগত লাইব্রেরিটি লোড করার সময় পাইথন জামিন পেয়েছিল । আমি যখন ফোল্ডারটিকে একটি স্থানীয় ডিরেক্টরিতে স্থানান্তরিত করি তখন সমস্যাটি চলে যায়। মনে Killedহয় এটি আমার লাইব্রেরির প্রাথমিক আমদানির সময় বন্ধ হয়ে গেছে কারণ আমি ফোল্ডারটি সরিয়ে নিয়ে যাওয়ার পরে হারিয়ে যাওয়া লাইব্রেরিগুলির বার্তা পেয়েছি।

আমি কম্পিউটারটি পুনরায় চালু করার পরে সমস্যাটি চলে গেল।

অতএব, লোকেরা প্রোগ্রামটি কোনও স্থানীয় ডিরেক্টরিতে স্থানান্তরিত করতে চেষ্টা করতে পারে যদি এটির কোনও অংশের বেশি অংশ থাকে বা এটি একটি ক্ষণস্থায়ী সমস্যা হতে পারে যা কেবল ওএসের রিবুট প্রয়োজন requires


অপেক্ষা করুন, আপনাকে কি আপনার হোস্ট বা ভিএম পুনরায় চালু করতে হবে?
সিগ্লেসেট

4
হ্যাঁ. আমার ক্ষেত্রে, আমি একটি নতুন ভিএম তৈরি করছিলাম এবং আমি যখন এই সমস্যাটি দেখলাম তখন আমি পাইথন ইনস্টল করেছি। রিবুট করার পরে এটি চলে গেল। জিনিসগুলি ঠিক করার উপায় হিসাবে আমি রিবুটকে ঘৃণা করি তাই ডিবাগ করার চেষ্টা করার সময় এবং এখানে এসও সহ এক ঘন্টা খনন করার পরে আমি অনেক সময় ব্যয় করি। তবে ঘটনাচক্রে, আমি হাল ছেড়ে দিয়ে রিবুট করলাম এবং প্রিস্টো করলাম। কেন এটি কাজ করেছে আমার কোনও ধারণা নেই।
টিমোথি সি কুইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.