আই / ও বড় ডেটা সেট সহ গণ্য সমস্যার জন্য কৌশল?


15

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

আমরা যে সমস্যাগুলির সাথে উদ্বিগ্ন হয়েছি সেগুলির মধ্যে অনেকগুলি ডেটা সেটের সাথে সম্পর্কিত হতে পারে যার অর্থ আমাদের আরও বেশি ক্রমিক পদ্ধতি ব্যবহার না করে মেমরির প্রচুর পরিমাণে ডেটা ট্র্যাক করা এবং সেগুলি বিশ্লেষণ করা দরকার।

আমি যা জানতে চাই তা হ'ল বড় ডেটা সেটগুলির স্ক্রিপ্টগুলিতে আই / ও পরিচালনা করার জন্য সবচেয়ে কার্যকর কৌশলগুলি কী। আমরা সাধারণত পাইথন-ভিত্তিক স্ক্রিপ্টগুলি ব্যবহার করি কারণ এটি ফাইল I / O কে কোডিং সি বা ফোর্টরানের তুলনায় অনেক কম বেদনাদায়ক করে তোলে, তবে যখন আমাদের দশক বা কয়েক মিলিয়ন লাইন প্রসেস করা দরকার তখন এটি এতটা পরিষ্কার হয় না যে সেরা পন্থাটি কী is । কোডের ফাইলের ইনপুট অংশটি সিতে করা উচিত, না অন্য কৌশলটি আরও কার্যকর? (সহজেই পুরো অ্যারেটিকে স্মৃতিতে প্রিলোডিং করা "খণ্ডগুলি" (মেগাবাইটের ক্রম) এর ধারাবাহিক পাঠের ধারাবাহিকের চেয়ে ভাল হবে?

কিছু অতিরিক্ত নোট:

  • আমরা প্রাথমিকভাবে "অন-লাইন" সরঞ্জামগুলির চেয়ে পোস্ট-প্রসেসিংয়ের জন্য স্ক্রিপ্টিং সরঞ্জামগুলির সন্ধান করছি — তাই পাইথনের ব্যবহার।

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

    ডি=16লিমΔটি(এক্স(টি+ +Δটি)-এক্স(টি))2

উত্তর:


6

আমি ধরে নিচ্ছি আপনার প্রশ্নটি পর্যবেক্ষণ থেকে আসে যে I / O আপনার পুরো বিশ্লেষণে উল্লেখযোগ্য ওভারহেডের কারণ করে। সেক্ষেত্রে আপনি গণনা দিয়ে I / O কে ওভারল্যাপ করার চেষ্টা করতে পারেন।

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

একটি সাধারণ উদাহরণ হিসাবে, আপনি যদি একবার কেবল নিজের ফাইলটি অতিক্রম করেন এবং প্রতিটি লাইন বা লাইনের সেট প্রসেস করেন তবে আপনি স্ট্রিমটিকে লাইনগুলির (বা এমবি) বিভক্ত করতে পারেন। তারপরে, খণ্ডগুলি জুড়ে প্রতিটি পুনরাবৃত্তিতে, অংশ i প্রসেস করার সময় আপনি অংশ i + 1 লোড করতে পারেন।

আপনার পরিস্থিতি আরও জটিল হতে পারে এবং আরও জড়িত সমাধানের প্রয়োজন হতে পারে। যাই হোক না কেন, প্রসেসরের কাজ করার জন্য কিছু ডেটা থাকাকালীন পটভূমিতে আই / ও সম্পাদন করা ধারণা। আপনি যদি আপনার নির্দিষ্ট সমস্যার বিষয়ে আরও বিশদ দেন তবে আমরা এটি আরও গভীরভাবে বিবেচনা করতে সক্ষম হতে পারি;)

---- আরও বিশদ দেওয়ার পরে বর্ধিত সংস্করণ ----

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

  • যদি আই / ও এর শতাংশ কম থাকে (আপনার মধ্যে যেমন কম থাকে তবে ওভারহেডের যত্ন নেই, তা যাই হোক না কেন: 0.5%, 2%, 5%, ...), তবে কেবল সহজ পদ্ধতির ব্যবহার করুন: ডেটা লোড করুন একবারে, এবং গণনা আপনি আপনার গবেষণার আরও আকর্ষণীয় দিকগুলির জন্য সময় সাশ্রয় করবেন।

  • যদি আপনি ওভারহেড সামর্থ না করে থাকেন তবে পেড্রোর পরামর্শ অনুসারে আপনি তা দেখতে চাইতে পারেন। অরন আহমদিয়া যা উল্লেখ করেছেন তা মনে রাখুন এবং সম্পূর্ণ বাস্তবায়নের আগে এটি পরীক্ষা করুন।

  • এন2এন

    chunk1 এবং chunk2 লোড করুন
    খণ্ডে i = 1 থেকে n
        অ্যাসিঙ্ক্রোনসিলে চিট আই +1 লোড করুন
        j = i + 1 থেকে n এ অংশগুলির জন্য
            অবিচ্ছিন্নভাবে শঙ্কিত জে + 1 লোড করুন
            খণ্ডগুলি i, j এর সাথে গণনা করুন (* প্রথম পুনরাবৃত্তির জন্য * এগুলি প্রিলোলোডড খণ্ডগুলি 1 এবং 2 *)

দ্রষ্টব্য: এটি দ্রুত এবং নোংরা সিউডোকোড, একটি সূচকগুলি সামঞ্জস্য করতে হবে।

এটি বাস্তবায়নের জন্য, তথাকথিত ডাবল-বাফারিং ব্যবহার করা সাধারণ । মোটামুটিভাবে বলা: দুটি কর্মক্ষেত্রে মেমরি ভাগ করুন; ডেটা ব্যাকগ্রাউন্ডে ওয়ার্কস্পেস 1-এ লোড করা হচ্ছে, প্রসেসরটি ওয়ার্কস্পেস 2-তে ডেটা দিয়ে গণনা করছে প্রতিটি প্রতিটি পুনরাবৃত্তিতে, ভূমিকাটি বিনিময় করুন।

আমি দুঃখিত আমি এখনই একটি ভাল রেফারেন্স নিয়ে আসতে পারছি না।

[1] ডিস্কে থাকা ডেটা নিয়ে দক্ষতার সাথে একটি কার্যকর অ্যালগরিদম কিছু দক্ষতা অবলম্বন করে (দক্ষতার সাথে)। ইন-কোর ("ইন-র্যাম") এর বিপরীতে এগুলিকে আউট-অফ-কোর বলা হয়।


7

আমাকে এর আগেও একই ধরণের সমস্যার সাথে মোকাবিলা করতে হয়েছিল এবং আমার প্রিয় সমাধান হ'ল মেমরি-ম্যাপযুক্ত আই / ও ব্যবহার করা , যদিও সি তে ...

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

একটি দ্রুত গুগল অনুসন্ধান আমাকে বলে যে এটি পাইথন: 16.7 এর জন্যও উপলব্ধ এমএমএপি - মেমরি-ম্যাপযুক্ত ফাইল সমর্থন , তবে পাইথন সম্পর্কে সত্যই আমি জানিনা যে এটি সত্যই একই জিনিস কিনা tell


1
mmapআপনার প্রধান কোডের মতো কিছু প্রয়োগের আগে আপনি মাপছেন এবং পরীক্ষা করেছেন তা নিশ্চিত করুন । অনেক আধুনিক অপারেটিং সিস্টেমগুলি readকম জটিলতার সাথে নিয়মিত মধ্যে একই রকম কর্মক্ষমতা দেয় । (এছাড়াও, হ্যাঁ, পাইথনের এমএম্যাপ উইন্ডোজ এবং ইউনিক্স মেমরি মানচিত্রে একটি বহনযোগ্য ইন্টারফেস সরবরাহ করে)।
আরন আহমদিয়া

1

সম্ভবত আপনি নিজের ফাইল আই / ও বিভাগে সাইথন ব্যবহার করতে পারেন এবং এই অংশটিকে সি কোডে রূপান্তর করতে পারেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.