পাইথন সিরিয়ালাইজেশন - কেন আচার?


88

আমি বুঝতে পেরেছিলাম পাইথন পিকিং একটি পাইথন অবজেক্টকে এমনভাবে সংরক্ষণ করতে পারে যা অবজেক্ট প্রোগ্রামিংকে সম্মান করে না - এটি txt ফাইল বা ডিবিতে লেখা আউটপুট থেকে আলাদা।

নিম্নলিখিত পয়েন্টগুলিতে আপনার আরও বিশদ বা রেফারেন্স রয়েছে:

  • আচারযুক্ত বস্তু 'সঞ্চিত' কোথায়?
  • বলা, ডিবিতে সংরক্ষণের চেয়ে অবজেক্টের উপস্থাপনা সংরক্ষণ করা কেন বেশি?
  • আমি কি এক পাইথন শেল সেশন থেকে অপরকে আচারযুক্ত জিনিসগুলি পুনরুদ্ধার করতে পারি?
  • সিরিয়ালাইজেশন কার্যকর হলে আপনার কি উল্লেখযোগ্য উদাহরণ রয়েছে?
  • আচার দিয়ে সিরিয়ালাইজেশন ডেটা 'সংক্ষেপণ' বোঝায়?

অন্য কথায়, আমি পিকিংয়ের বিষয়ে একটি ডক সন্ধান করছি - পাইথন.ডক ব্যাখ্যা করে কীভাবে আচারটি প্রয়োগ করা যায় তবে সিরিয়ালকরণের প্রয়োজনীয়তা এবং প্রয়োজনীয়তা সম্পর্কে বিশদ সম্পর্কে ডুব দেয় না।


পরবর্তী পুনরুদ্ধারের জন্য রাষ্ট্র বাঁচানো বা কোনও অজগর রানটাইমের সাথে কোনও জিনিস ভাগ / অনুলিপি করা আমার অনুমান হবে।
সিনথেসাইজারপ্যাটেল

13
আপনার অনেক প্রশ্নের উত্তর উইকিপিডিয়ায় সিরিয়ালিফিকেশন নিবন্ধ দ্বারা দেওয়া হয়েছে: en.wikedia.org/wiki/Serialization
এনপিই

4
আপনি কি জিজ্ঞাসা করছেন পাইথনে সিরিয়ালাইজেশনের জন্য কেন আমার পিকলের দরকার হবে? না বরং সিরিয়ালাইজেশন আসলে কী?
moooeeeep

আচার সহ সুরক্ষা সংক্রান্ত সমস্যাগুলি উল্লেখ করা ভাল। উদাহরণ খুঁজে পাওয়া যেতে পারে ডক্স , এবং অসংখ্য তাই প্রশ্ন, মত এই এক
djvg

উত্তর:


99

পিকলিং হল অজগর বস্তুকে (তালিকা, ডিক ইত্যাদি) চরিত্রের প্রবাহে রূপান্তর করার একটি উপায়। ধারণাটি হ'ল এই চরিত্রের স্ট্রিমটিতে অন্য পাইথন স্ক্রিপ্টে অবজেক্টটি পুনর্গঠন করার জন্য প্রয়োজনীয় সমস্ত তথ্য রয়েছে।

যেখানে আখরোগযুক্ত তথ্য সংরক্ষণ করা হয়, সেখানে সাধারণত:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

এটি আমাদের varডিকের আচারিত সংস্করণটি 'ফাইলের নাম' ফাইলে সংরক্ষণ করবে। তারপরে, অন্য স্ক্রিপ্টে, আপনি এই ফাইলটি থেকে একটি ভেরিয়েবলের মধ্যে লোড করতে পারেন এবং অভিধানটি আবার তৈরি করা হবে:

with open('filename','rb') as f:
    var = pickle.load(f)

বাছাইয়ের জন্য আরেকটি ব্যবহার হ'ল যদি আপনাকে এই অভিধানটি কোনও নেটওয়ার্কের মাধ্যমে প্রেরণ করতে হয় (সম্ভবত সকেট বা কোনও কিছু দিয়ে with

এছাড়াও, এখানে কথা বলার জন্য কোনও "সংক্ষেপণ" নেই ... এটি কেবল একটি উপস্থাপনা (র‌্যামে) থেকে অন্যটিতে ("পাঠ্যে") রূপান্তরিত করার উপায়।

About.com pickling একটি চমৎকার ভূমিকা রয়েছে এখানে


4
সাধারণত একটি করতেনwith open('filename') as f: ...
মূওইপ

4
এছাড়াও, আপনাকে করতে হবে with open(filename, 'wb') as f: ...বা আপনি ফাইলটিতে লিখতে সক্ষম হবেন না।
টিম পিটজ্যাকার

ধন্যবাদ !! পাইথন অধ্যবসায় পরিচালনার জন্য এটি একটি দুর্দান্ত, এখানে
কিরিলফ

4
সাধারণত pickleকোনও নেটওয়ার্কের মাধ্যমে অভিধান প্রেরণ করার জন্য এটি ব্যবহার করা খুব ভাল ধারণা নয় (এখানে জেএসন আরও ভাল হতে পারে)। যদিও বিরল ক্ষেত্রে এটি কার্যকর হতে পারে উদাহরণস্বরূপ, multiprocessingমডিউল।
jfs

@ টিম পিটজেকার: protocol=0( পাইথন 2.x এ ডিফল্ট) টেক্সট মোডে খোলা ফাইলগুলির সাথে ব্যবহার করা যেতে পারে।
jfs

36

বিতরণ এবং সমান্তরাল কম্পিউটিংয়ের জন্য পিক্লিং একেবারে প্রয়োজনীয়।

বলুন যে আপনি সমান্তরাল মানচিত্রটি কমাতে চেয়েছিলেন multiprocessing(বা পাইনা সহ ক্লাস্টার নোড জুড়ে ), তারপরে আপনাকে নিশ্চিত করতে হবে যে সমান্তরাল সংস্থানগুলি জুড়ে ম্যাপ করার জন্য আপনি যে ক্রিয়াকলাপটি করতে চান তা আচার হবে। যদি এটি আচার না করে থাকে তবে আপনি এটিকে অন্য প্রক্রিয়া, কম্পিউটার ইত্যাদির অন্যান্য সংস্থানগুলিতে প্রেরণ করতে পারবেন না এবং একটি ভাল উদাহরণের জন্য এখানে দেখুন ।

এটি করার জন্য, আমি ডিল ব্যবহার করি , যা পাইথনের প্রায় কোনও কিছুই সিরিয়ালাইজ করতে পারে। আপনার কোডটি ব্যর্থ হয়ে যাওয়ার পরে আপনার পিকিং কী কারণে ব্যর্থ হয় তা বুঝতে সাহায্য করার জন্য ডিলেরও কিছু ভাল সরঞ্জাম রয়েছে ।

এবং, হ্যাঁ, গণনা বা আপনার আইপথন সেশন বা যা-ই হোক না কেনের অবস্থা বাঁচাতে লোকেরা বাছাই ব্যবহার করে । আপনি চাইলে bz2বা gzipতার সাথে সংকোচনের জন্য আচারের পিকার এবং আনপিকলারও প্রসারিত করতে পারেন।


0

আমি এটি বড় এবং জটিল কাস্টম ক্লাসগুলির সাথে বিশেষভাবে দরকারী বলে মনে করি। একটি বিশেষ উদাহরণে আমি ভাবছি, ক্লাস তৈরির জন্য তথ্য (একটি ডাটাবেস থেকে) সংগ্রহ করা ইতিমধ্যে অর্ধেক যুদ্ধ ছিল। তারপরে ক্লাসে সঞ্চিত তথ্যটি ব্যবহারকারী রানটাইমে পরিবর্তিত হতে পারে।

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

বিকল্পভাবে, আপনি পুরো ক্লাসটিকে যেমন করেন তেমনই আচার তৈরি করতে পারেন এবং তারপরে এটি ডাটাবেসে একটি একক ক্ষেত্রে সংরক্ষণ করতে পারেন। তারপরে আপনি যখন এটি আবার লোড করতে যান, তখন এটি সমস্ত আগের মতোই একবারে লোড হয়ে যাবে। জটিল ক্লাসগুলি সংরক্ষণ এবং পুনরুদ্ধার করার সময় এটি অনেক সময় এবং কোড সাশ্রয় করতে পারে।


-1

এটি এক ধরণের সিরিয়ালাইজেশন। সিপিকল ব্যবহার করুন এটি আচারের চেয়ে অনেক দ্রুত।

import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.