সুপার হাই পারফরম্যান্স সি / সি ++ হ্যাশ ম্যাপ (টেবিল, অভিধান) [বন্ধ]


86

উচ্চ-কার্যকারিতা হ্যাশ মানচিত্রের ডেটা স্ট্রাকচারে মানগুলি কাঠামোর জন্য আমাকে আদিম কীগুলি (ইন্ট, সম্ভবত দীর্ঘ) মানচিত্রের প্রয়োজন।

আমার প্রোগ্রামটিতে এই মানচিত্রগুলির কয়েক শত থাকবে এবং প্রতিটি মানচিত্রে সাধারণত সর্বাধিক কয়েক হাজার এন্ট্রি থাকবে। তবে মানচিত্রগুলি ক্রমাগত "রিফ্রেশ" বা "মন্থন" হবে; কয়েক মিলিয়ন addএবং deleteবার্তাগুলি প্রক্রিয়াকরণের কল্পনা করুন imagine

সি বা সি ++ এর কোন লাইব্রেরিতে কোনও ডেটা স্ট্রাকচার রয়েছে যা এই ব্যবহারের ক্ষেত্রে ফিট করে? বা, আপনি কীভাবে নিজের বিল্ডিংয়ের পরামর্শ দিবেন? ধন্যবাদ!


4
আপনার কি আপনার ডেটাতে কীগুলি সন্ধানের প্রক্রিয়া করা দরকার?
গিলিয়াম লেবুর্জিও

4
আপডেট বা পুনরুদ্ধার আরও ঘন ঘন হবে? (যোগ করুন / মুছুন, বা পড়ুন / আপডেট করুন যা কীটি পরিবর্তন করছে না)
ফলসট্র

stackoverflow.com/questions/266206/… । এটি সম্ভবত শুরু করার জন্য একটি ভাল জায়গা।
ডামকোডার

4
@roe:অ্যাড / ডিলিট অপারেশনগুলি গেট অপারেশনের চেয়ে অনেক বেশি (100x) ঘন ঘন।
হিউউড জাবলোমে

4
সাড়ে চার বছর পর আপনার প্রয়োজনগুলি সবচেয়ে বেশি কী উপযুক্ত তা জেনে রাখা আকর্ষণীয় হবে। যদি বর্তমানের উত্তরগুলির কোনওটি সন্তোষজনক না হয় তবে আপনি নিজের লেখা লিখে তা গ্রহণ করতে পারেন।
ওয়াল্টার ট্রস

উত্তর:


31

আমি আপনাকে গুগল স্পার্সহ্যাশ (বা সি 11 সংস্করণ গুগল স্পার্সে হ্যাশ-সি 11 ) ব্যবহার করার পরামর্শ দিচ্ছি এবং এটি আপনার প্রয়োজনের অনুধাবন করে কিনা তা দেখুন। তাদের একটি স্মৃতিশক্তি দক্ষ প্রয়োগের পাশাপাশি গতির জন্য অনুকূলিতকরণ রয়েছে। আমি একটি দীর্ঘকাল আগে একটি বেঞ্চমার্ক করেছি, এটি ছিল গতির দিক থেকে উপলব্ধ হ্যাশটেবল বাস্তবায়ন (তবে ত্রুটিগুলি সহ)।


16
ত্রুটিগুলি কী ছিল তা ব্যাখ্যা করতে পারেন?
হিউউড জাবলমে

আইআইআরসি, এটি একটি মেমরির সমস্যা ছিল, কোনও উপাদান অপসারণ করার সময়, উপাদানটি ধ্বংস হয়ে যায় তবে এর স্মৃতিটি এখনও বেঁচে থাকে (আমার ধারনা ক্যাশে হিসাবে ব্যবহৃত হয়)।
Scharron

4
@ হেউড জাবলোমি: প্রধান অসুবিধাটি হ'ল এটির জন্য আপনাকে এক বা দুটি বিভক্ত করা প্রয়োজন (যদি আপনি কখনও উপাদানগুলি মুছেন) এবং সেগুলি কখনই ব্যবহার করবেন না। কিছু ক্ষেত্রে এটি করা সহজ, উদাহরণস্বরূপ নেতিবাচক ints বা এর মতো, তবে অন্যান্য ক্ষেত্রেও তেমন নয়।
দ্বিগুণ করুন

4
আপনি কি আজ এই সুপারিশের পাশে দাঁড়াবেন?
einpoklum

11

সি বা সি ++ এর কোন লাইব্রেরিতে কোনও ডেটা স্ট্রাকচার রয়েছে যা এই ব্যবহারের ক্ষেত্রে ফিট করে? বা, আপনি কীভাবে নিজের বিল্ডিংয়ের পরামর্শ দিবেন? ধন্যবাদ!

এলজিপিএল'র জুডি অ্যারেগুলি দেখুন । নিজেকে কখনই ব্যবহার করিনি, তবে কয়েকটি অনুষ্ঠানে আমার কাছে বিজ্ঞাপন দেওয়া হয়েছিল।

আপনি এসটিএল পাত্রে (স্ট্যান্ড :: হ্যাশ_ম্যাপ ইত্যাদি) বেঞ্চমার্ক করার চেষ্টা করতে পারেন। প্ল্যাটফর্ম / বাস্তবায়ন এবং উত্স কোড টিউনিংয়ের উপর নির্ভর করে (আপনি যতটা গতিশীল মেমরি পরিচালনা করতে পারেন তা ব্যয়বহুল) তারা যথেষ্ট পারফরম্যান্স হতে পারে।

এছাড়াও, যদি চূড়ান্ত সমাধানের কার্যকারিতা সমাধানের ব্যয়কে কমিয়ে দেয়, আপনি সবকিছুকে প্লেইন অ্যারেতে রাখার জন্য পর্যাপ্ত র‌্যামযুক্ত সিস্টেমটিকে অর্ডার করার চেষ্টা করতে পারেন। সূচকের মাধ্যমে অ্যাক্সেসের পারফরম্যান্স অপরাজেয়।

অ্যাড / ডিলিট অপারেশনগুলি গেট অপারেশনের চেয়ে অনেক বেশি (100x) ঘন ঘন।

এটি ইঙ্গিত দেয় যে আপনি প্রথমে প্রথমে অ্যালগরিদমগুলি উন্নত করতে মনোনিবেশ করতে চাইতে পারেন। যদি ডেটা শুধু লেখা থাকে, না পড়ে, তবে এগুলি কেন মোটেই লিখব?


11

কেবলমাত্র boost::unordered_map(বা tr1ইত্যাদি) ডিফল্টরূপে ব্যবহার করুন। তারপরে আপনার কোডটি প্রোফাইল করুন এবং দেখুন যে কোডটি বাধা। তবেই আমি দ্রুত বিকল্প খুঁজে পেতে আপনার প্রয়োজনীয়তাগুলি বিশদভাবে বিশ্লেষণ করার পরামর্শ দেব।


15
এটা. std::unordered_mapআমি কেবলমাত্র প্রক্রিয়াকরণের অপেক্ষাকৃত ছোট অংশের জন্য মানচিত্র ব্যবহার করি, যদিও আমার কার্যকর সম্পাদনের সময়কালের 90 +% সময় নিচ্ছে ভিএস2013's
ক্যামেরন

6

আপনার যদি মাল্টিথ্রেডেড প্রোগ্রাম থাকে তবে আপনি ইন্টেল থ্রেড বিল্ডিং ব্লকস লাইব্রেরিতে কিছু দরকারী হ্যাশ টেবিলগুলি খুঁজে পেতে পারেন । উদাহরণস্বরূপ, টিবিবি :: সমকালীন_অনর্ডার্ড_ম্যাপের স্টাডি :: আনর্ডারড_ম্যাপের মতো একই এপিআই রয়েছে তবে এটির মূল কাজগুলি থ্রেড নিরাপদ।

ফেসবুকের মূর্খ গ্রন্থাগারটিও একবার দেখুন , এতে উচ্চ কার্যকারিতা সহকারী হ্যাশ টেবিল এবং স্কিপ তালিকা রয়েছে



3

অ্যান্ড্রয়েড উত্স থেকে (এভাবে অ্যাপাচি 2 লাইসেন্সযুক্ত)

https://github.com/CyanogenMod/android_system_core/tree/ics/libcutils

হ্যাশম্যাপ.সি দেখুন, / cutils / hashmap.h অন্তর্ভুক্ত চয়ন করুন, যদি আপনার থ্রেড সুরক্ষার প্রয়োজন না হয় আপনি মুটেক্স কোডটি সরিয়ে ফেলতে পারেন, একটি নমুনা বাস্তবায়ন libcutils / str_parms.c এ রয়েছে is


2

লাইবমেচ ক্যাশের মতো বিদ্যমান সমাধানগুলি আপনার প্রয়োজনের সাথে খাপ খায় কিনা তা আগে পরীক্ষা করুন।

যদি না ...

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

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

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

  1. ভাল পুরাতন মৌলিক সংখ্যা বহুগুণ
  2. http://www.azillionmonkeys.com/qed/hash.html
  3. http://burtleburtle.net/bob/
  4. http://code.google.com/p/google-sparsehash/

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

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

শত ম্যাপের তুলনায় সমাধানটি কীভাবে সম্পাদন করে তা আপনি পরীক্ষা করতে পারেন .. আমার মনে হয় মেমরির প্রোফাইলিং দৃষ্টিকোণ থেকে এটি আরও ভাল হতে পারে ... যদি আপনি এই অনুশীলনটি করতে চান তবে ফলাফল কোথাও পোস্ট করুন please

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

শুভকামনা


2

বিবিধ কনটেইনার টেমপ্লেটগুলি থেকে হ্যাশ টেবিল ব্যবহার করে দেখুন । এটি closed_hash_mapগুগলের মতো একই গতি সম্পর্কে dense_hash_map, তবে এটি ব্যবহার করা সহজ (অন্তর্ভুক্ত মানের উপর কোনও সীমাবদ্ধতা নেই) এবং এর সাথে কিছু অন্যান্য পার্ক রয়েছে।


2

আমি উত্সাহের পরামর্শ দেব । কেবল কাঠামোতে #include "uthash.h"একটি যুক্ত করুন UT_hash_handleএবং কী হিসাবে কাজ করতে আপনার কাঠামোর এক বা একাধিক ক্ষেত্র চয়ন করুন। এখানে কর্মক্ষমতা সম্পর্কে একটি শব্দ ।


1

http://incise.org/hash-table-benchmark.html gcc এর খুব কার্যকর বাস্তবায়ন হয়েছে। তবে মনে রাখবেন যে এটি অবশ্যই খুব খারাপ মানের সিদ্ধান্তকে সম্মান করবে:

যদি কোনও পুনঃস্থাপন ঘটে, সমস্ত পুনরুক্তিকারীকে অবৈধ করা হয়, তবে পৃথক উপাদানগুলিতে রেফারেন্স এবং পয়েন্টারগুলি বৈধ থাকে। যদি প্রকৃত পুনঃস্থাপন না ঘটে, কোনও পরিবর্তন হয় না।

http://www.cplusplus.com/references/unordered_map/unordered_map/rehash/

এর অর্থ মূলত স্ট্যান্ডার্ডটি বলে যে বাস্তবায়নটি লিঙ্কযুক্ত তালিকার উপর নির্ভর করে। এটি উন্মুক্ত সম্বোধনকে বাধা দেয় যা আরও ভাল পারফরম্যান্স করে has

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


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