সবচেয়ে কার্যকর জাভা সংগ্রহ লাইব্রেরি কি? [বন্ধ]


135

সবচেয়ে কার্যকর জাভা সংগ্রহ লাইব্রেরি কি?

কয়েক বছর আগে, আমি জাভা অনেকটা করেনি এবং ফিরে তারপর যে ছাপ ছিল trove সেরা (সবচেয়ে বেশি কার্যকরী) জাভা সংগ্রহগুলি বাস্তবায়ন। কিন্তু যখন আমি " সর্বাধিক কার্যকর ফ্রি জাভা লাইব্রেরি? " এই প্রশ্নের উত্তরগুলি পড়েছি তখন আমি লক্ষ্য করেছি যে ট্রভের উল্লেখ করা খুব কমই আছে। তাহলে কোন জাভা সংগ্রহের পাঠাগারটি এখন সেরা?

আপডেট: স্পষ্ট করতে, আমি প্রায়শই হ্যাশ টেবিল ইত্যাদিতে কয়েক মিলিয়ন এন্ট্রি জমা করতে হয় তখন কোন লাইব্রেরিটি ব্যবহার করতে হবে তা জানতে চাই (একটি ছোট রানটাইম এবং মেমরির পদক্ষেপের প্রয়োজন)।


এই টেবিলের কী এবং মানগুলি কি? যদি তারা আদিম না হয়, তবে সাধারণ হ্যাশম্যাপ ইত্যাদিতে কী সমস্যা?
জন স্কিটি

খুব বড় মানচিত্রের জন্য আপনি একটি পরীক্ষামূলক বাস্তবায়ন, বা এমনকি ডাটাবেস টেবিলের মতো ইনলাইন করতে চান।
টম হাটিন - 10:58

1
মজার বিষয় হল আমি এখানে কোল্টের কোনও উল্লেখ দেখতে পাই না যা পরবর্তীকালে মাহাউটে জমা হয়েছিল।
স্মার্টনট 1007

4
এটি খুব সুন্দর সংগ্রহ লাইব্রেরি - জিএস সংগ্রহ (github.com/goldmansachs/gs-colferences) উল্লেখ করার মতো। এটিতে অসাধারণ ডকুমেন্টেশন এবং এক পরিবর্তনীয় এবং পরিবর্তনীয় সংগ্রহের সেট রয়েছে
পিয়োটার কোচস্কি

উত্তর:


73

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

ব্যক্তিগতভাবে (এবং আমি পক্ষপাতদুষ্ট) আমি পেয়ারা ভালবাসি (প্রাক্তন গুগল জাভা সংগ্রহ সংগ্রহ প্রকল্প সহ)। এটি বিভিন্ন কাজকে (সংগ্রহ সহ) অনেক সহজ করে তোলে এমন একটি উপায়ে যা অন্তত যুক্তিযুক্ত দক্ষ। প্রদত্ত যে সংগ্রহের ক্রিয়াকলাপগুলি আমার কোডটিতে খুব কমই একটি বাধা তৈরি করে (আমার অভিজ্ঞতায়) এটি সংগ্রহের এপিআইর তুলনায় এটি "ভাল" যা আরও কার্যকর হতে পারে তবে আমার কোডটি পাঠযোগ্য হিসাবে তৈরি করে না।

প্রদত্ত যে ট্রভ এবং পেয়ারার মধ্যে ওভারল্যাপটি অনেকটা শূন্য, সম্ভবত আপনি কোনও সংগ্রহের লাইব্রেরি থেকে কী সন্ধান করছেন তা স্পষ্ট করে বলতে পারেন।


3
@ আন্ড্রেয়াস: আমি সম্মত বলতে পারি না। এটি কোনও "এক বা অন্য" দৃশ্যের নয় - আমি নিয়মিত সংগ্রহগুলি ব্যবহার করি (তালিকাগুলির মতো সহায়তাকারীদের সাথে) এবং তারপরে আমার যখন প্রয়োজন হয় তখন Iterables ইত্যাদি ব্যবহার করি। জটিলতা কেবল তখনই ব্যবহার করুন যখন এটি আপনাকে সহায়তা করে।
জন স্কিটি

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

1
@ আন্ড্রেয়াস: ফিরে এসে এত তা বলেছিলেন বলে ধন্যবাদ - জিজেসি সাহায্য করছে শুনে আমি আনন্দিত :)
জন স্কিটি

2
আরে, জন, গুগল জাভা সংগ্রহগুলি এখন পেয়ারা । আপনি ভবিষ্যতের রেফারেন্সের জন্য আপনার পোস্টটি আপডেট করতে চাইতে পারেন :)
আর্টুর Czajka

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

104

প্রশ্নটি এখন (এখন) প্রচুর ডেটা সংরক্ষণ করার বিষয়ে, যা intমানচিত্রে আদিম ধরণের ব্যবহার করে উপস্থাপন করা যেতে পারে । এখানে কিছু উত্তর আমার মতে খুব বিভ্রান্তিকর। দেখা যাক কেন।

রানটাইম এবং মেমরি উভয় খরচ উভয়ই পরিমাপ করতে আমি ট্র্যাভ থেকে মানদণ্ডটি সংশোধন করেছি । আমি এই বেঞ্চমার্কে পিসিজেও যুক্ত করেছি , এটি আদিম ধরণের জন্য আরেকটি সংগ্রহ গ্রন্থাগার (আমি এটি একটি ব্যাপকভাবে ব্যবহার করি)। 'অফিসিয়াল' ট্রভ বেঞ্চমার্কটি ইন্টারন্টম্যাপগুলি জাভা সংগ্রহের সাথে তুলনা করে না Map<Integer, Integer>, সম্ভবত সঞ্চয় Integersএবং সংরক্ষণ intsপ্রযুক্তিগত দৃষ্টিকোণ থেকে এক নয়। তবে কোনও ব্যবহারকারীর এই প্রযুক্তিগত বিশদ সম্পর্কে যত্নশীল হতে পারে না, তিনি intsদক্ষতার সাথে উপস্থাপনযোগ্য ডেটা সংরক্ষণ করতে চান ।

প্রথমে কোডের প্রাসঙ্গিক অংশ:

new Operation() {

     private long usedMem() {
        System.gc();
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
     }

     // trove
     public void ours() {
        long mem = usedMem();
        TIntIntHashMap ours = new TIntIntHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           ours.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("trove " + mem + " bytes");
        ours.clear();
     }

     public void pcj() {
        long mem = usedMem();
        IntKeyIntMap map = new IntKeyIntOpenHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("pcj " + mem + " bytes");
        map.clear();
     }

     // java collections
     public void theirs() {
        long mem = usedMem();
        Map<Integer, Integer> map = new HashMap<Integer, Integer>(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("java " + mem + " bytes");
        map.clear();
     }

আমি ধরে নিই যে ডেটাটি আদিম হিসাবে আসে intsযা বুদ্ধিমান বলে মনে হয়। তবে এটি জাভা ব্যবহারের জন্য রানটাইম জরিমানা বোঝায়, কারণ অটো-বক্সিং, যা আদিম সংগ্রহের কাঠামোর জন্য প্রয়োজনীয় নয়।

উইনএক্সপিতে রানডটাইম ফলাফল ( gc()অবশ্যই কল ছাড়াই ), jdk1.6.0_10:

                      100000 পুট অপারেশন 100000 অপারেশন রয়েছে 
জাভা সংগ্রহগুলি 1938 এমএস 203 এমএস
ট্রভ 234 এমএস 125 এমএস
পিসিজে 516 এমএস 94 এমএস

যদিও এটি ইতিমধ্যে কঠোর মনে হচ্ছে, এই জাতীয় কাঠামো ব্যবহার করার কারণ এটি নয়।

কারণ স্মৃতি কর্মক্ষমতা। 100000 এন্ট্রিযুক্ত মানচিত্রের ফলাফল int:

জাভা সংগ্রহগুলি 6644536 এবং 7168840 বাইটের মধ্যে দোলনা দেয়
1853296 বাইট ট্রভ
পিসিজে 1866112 বাইট

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

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

সুতরাং: না, java.util এর উত্তর নয়। দক্ষতা সম্পর্কে জিজ্ঞাসা করার সময় জাভা সংগ্রহগুলিতে "কার্যকারিতা যুক্ত করা" মুখ্য বিষয় নয়। এছাড়াও আধুনিক JDK সংগ্রহ না না "এমনকি বিশেষ Trove সংগ্রহের বাইরে সঞ্চালন"।

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


3
আসলে, আমি মনে করি আপনার উত্তর বিভ্রান্তিকর। ইন্টিজ বনাম ইন্টিজ সংরক্ষণ করা খুব আলাদা এবং সম্ভবত মেমরির ব্যবহার বর্ধনের মূল কারণ। আমি একমত যে কোনও কাঁচা ধরণের সংগ্রহের কাঠামোটি কার্যকর হতে পারে তবে এটি জাভা.ইটিলের চেয়ে ট্রভ বা পিসিজে "আরও ভাল" করে না।
উয়র্ন

22
প্রশ্নটি দক্ষতার সাথে ডেটা সঞ্চয় করার বিষয়ে। পূর্ণসংখ্যা সংরক্ষণের বিষয়ে নয়। এই কাজের জন্য ট্রভ / পিসিজে আরও দক্ষ, যেমনটি আমি দেখানোর চেষ্টা করেছি। পূর্ণসংখ্যা ব্যবহার রানটাইম এবং মেমরির অদক্ষতাকে চাপিয়ে দেয়। যেহেতু java.util আদিমদের ব্যবহারের অনুমতি দেয় না, তাই এই কাজের জন্য এটি সেরা পছন্দ নয়।
the.duckman

2
(রাশিয়ান সম্প্রদায়ের জন্য) এখানে আরও একটি মানদণ্ড রয়েছে: মোট-holywar.blogspot.com/2011/07/…
dma_k

নিশ্চিত না যে আমরা কী হিসাবে কী ব্যবহার করি না, কেবল সাধারণ স্ট্রিং। তাদের জন্য ওয়ার্কবেঞ্চ ফলাফল কি হবে?
ক্লার্ক বাও

@ ক্লার্কবাও (দেরি হওয়ার জন্য দুঃখিত) যে কোনও বস্তুকে কী হিসাবে সংরক্ষণ করা অবজেক্টটি ব্যবহার করবে hashCode()। এটি আপনাকে intচাবি হিসাবে পেয়েছে ।
ম্যাথিউউ

47

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

বেঞ্চমার্ক মেকানিক্স এবং গ্রন্থাগারগুলি আচ্ছাদন হিসাবে এখানে আরও নিখুঁত বিশ্লেষণ করা হল। এটি মহাউট দেব তালিকার একটি থ্রেড।

গ্রন্থাগারগুলি কভার করা হয়

  • HPPC
  • Trove
  • FastUtil
  • মাহাউট (কোল্ট)
  • জাভা সংগ্রহ

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


1
ধন্যবাদ. এটি খুব সহায়ক ছিল .. প্রশ্নের গুরুত্ব বিবেচনা করে অন্য উত্তরগুলির (ড.ডাকম্যানের ব্যতীত) আসলে কোনওটিরই উত্তর দেওয়া বিশ্বাস করা কঠিন।
ডেক্সটার

20

অন্যান্য ভাষ্যকাররা যেমন লক্ষ্য করেছেন, "দক্ষ" এর সংজ্ঞাটি একটি বিস্তৃত জাল ফেলে। তবে কেউ এখনও জাভোলিউশন লাইব্রেরির উল্লেখ করেননি ।

কিছু হাইলাইট:

  • জাভোলিউশন ক্লাসগুলি দ্রুত, খুব দ্রুত (উদাহরণস্বরূপ স্ট্রিংবুফার / স্ট্রিংবিল্ডারের জন্য ও [লগ (এন)] এর পরিবর্তে পাঠ্য সন্নিবেশ / মুছে ফেলা)।
  • সমস্ত জাভোলিউশন ক্লাসগুলি কঠোর রিয়েল-টাইম অনুগত এবং অত্যন্ত নির্বিচার আচরণ (মাইক্রোসেকেন্ড সীমার মধ্যে) থাকে। তদ্ব্যতীত (স্ট্যান্ডার্ড লাইব্রেরির বিপরীতে) জাভলিউশনটি আরটিএসজে নিরাপদ (জাভা রিয়েল-টাইম এক্সটেনশনের সাথে ব্যবহার করার সময় কোনও মেমরির সংঘাত বা মেমরি ফাঁস নয়)।
  • জাভোলিউশনের রিয়েল-টাইম সংগ্রহের ক্লাসগুলি (মানচিত্র, তালিকা, টেবিল এবং সেট) বেশিরভাগ মানক সংগ্রহের ক্লাসের জায়গায় ব্যবহার করা যেতে পারে এবং অতিরিক্ত কার্যকারিতা সরবরাহ করে।
  • জাভোলিউশন সংগ্রহগুলি সমান্তরাল অ্যালগোরিদমগুলির বাস্তবায়নকে আরও সহজ করার জন্য সম্মতিযুক্ত গ্যারান্টি সরবরাহ করে।

জাভোলিউশন বিতরণে একটি বেঞ্চমার্ক স্যুট অন্তর্ভুক্ত রয়েছে যাতে আপনি দেখতে পারেন যে কীভাবে তারা অন্যান্য গ্রন্থাগারগুলি / অন্তর্নির্মিত সংগ্রহগুলির বিরুদ্ধে স্ট্যাক আপ করে।


16

কিছু সংগ্রহ বিবেচনা করার জন্য libs:

আমি প্রথম এবং সর্বাগ্রে জেডিকে সংগ্রহের পাঠাগারটিতে পৌঁছে যাব। এটি আপনার করা সবচেয়ে সাধারণ জিনিসগুলি কভার করে এবং স্পষ্টতই এটি আপনার কাছে উপলভ্য।

গুগল সংগ্রহগুলি সম্ভবত জেডিকে-র বাইরে সর্বোত্তম মানের গ্রন্থাগার। এটি ভারী ব্যবহৃত এবং ভাল সমর্থিত।

অ্যাপাচি কমন্স সংগ্রহগুলি পুরানো এবং "অনেকগুলি রান্না করা" সমস্যা থেকে খানিকটা ক্ষতিগ্রস্থ হয় তবে এর সাথে প্রচুর উপকারী জিনিসও রয়েছে।

ট্রাইভের আদিম কী / মানগুলির মতো ক্ষেত্রে খুব বিশিষ্ট সংগ্রহ রয়েছে। আজকাল আমরা দেখতে পাই যে আধুনিক জেডিকে এবং জাভা 5+ সংগ্রহ এবং সমবর্তী ব্যবহারের ক্ষেত্রে জেডিকে সংগ্রহ এমনকি বিশেষায়িত ট্রভ সংগ্রহগুলিও সম্পাদন করে।

আপনার যদি সত্যই উচ্চতর সম্মতিমূলক ব্যবহারের কেস থাকে তবে আপনার অবশ্যই উচ্চ-স্কেল লিবে ননব্লকিংহ্যাশম্যাপের মতো জিনিসগুলি অবশ্যই পরীক্ষা করা উচিত, এটি একটি লক-ফ্রি বাস্তবায়ন এবং যদি আপনার যদি এটির সঠিক ব্যবহারের ক্ষেত্রে থাকে তবে কনকন্টারহ্যাশম্যাপে স্টম্প করতে পারেন।


7
"আজকাল আমরা দেখতে পেয়েছি যে আধুনিক জেডিকে এবং জাভা 5+ সংগ্রহ এবং একই সাথে ব্যবহারের ক্ষেত্রে জেডিকে সংগ্রহ এমনকি বিশেষায়িত ট্রভ সংগ্রহগুলিও সম্পাদন করে।" বিভ্রান্তিকর - আমি এমন কোনও মাইক্রো-বেঞ্চমার্ক দেখিনি যেখানে ট্র্যাভের মতো বিশেষায়িত আদিম-সংগ্রহ শ্রেণিতে আদিম প্রকারগুলি সংরক্ষণ / পুনরুদ্ধার মেমরি ব্যবহার এবং সিপিইউ উভয় সময়ে জেডিকে সংগ্রহের ক্লাসকে ছাড়িয়ে যায়নি। আপনি যদি (যদিও আদিম ধরণের নয়) অবজেক্টগুলি ব্যবহার করছেন তবে আমি অ্যালেক্সের সাথে একমত হব, সংগ্রহের উপর চাপিয়ে ফেলা কোনও চুক্তি হিসাবে বড় নয়।
রিয়াদ কল্লা

2
এই বিবৃতি ভারী বাস্তব-বিশ্বের ব্যবহারের উপর ভিত্তি করে ছিল (যা আমি কোনও দিন কোনও মাইক্রো-বেঞ্চমার্ক গ্রহণ করব) যেখানে আমাদের আগে ট্রভ সংগ্রহের প্রয়োজন ছিল তবে এখন তা টানতে সক্ষম হয়েছি। জেডিকে L টি আপডেট (দেরী ২০০৯) আসলে ইন্টিজারের মতো সাধারণ মানচিত্র কীগুলির জন্য কাস্টম কোড সরবরাহ করেছিল যা সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে যথেষ্ট উন্নতি করেছে।
অ্যালেক্স মিলার

1
আলেকস, আমি আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে সন্দেহ করি না যে আদিম সংগ্রহগুলি সরিয়ে নেওয়া এবং জেডিকে সংগ্রহের সাথে যাওয়া যথেষ্ট দ্রুত ছিল, তবে সংগ্রহের যে ল্যান্ডস্কেপটি আপনার হাত ঘেউ ঘেউ করে বলছে যে "আপনি যে সমস্ত পাস করেন, এটি যথেষ্ট দ্রুত! " সঠিক নয়। যদি আমি 2 ডি গেম ইঞ্জিনে কাজ করি তবে আমার আদিম ধরণের ক্রমাগত বক্সিং / আনবক্সিংয়ের ওভারহেড পরিমাপযোগ্য ব্যয়বহুল। যদি আমি একটি REST এপিআইতে কাজ করি তবে না, এটি সম্ভবত HTTP I / O এর মতো অনেক বেশি ব্যয়বহুল অপ্সের ক্ষেত্রে কোনও পরিমাপযোগ্য আলাদা করে না। আমি কেবল আপনার পোস্টের পরিমাণ প্রমাণ করতে বাধ্য বোধ করি is
রিয়াদ কল্লা

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

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

6

java.util

সুস্পষ্ট উত্তরের জন্য দুঃখিত, তবে বেশিরভাগ ব্যবহারের জন্য, ডিফল্ট জাভা সংগ্রহগুলি পর্যাপ্ত চেয়ে বেশি।


4
হ্যাঁ, প্রাথমিক ব্যবহারের জন্য। তবে আমি মনে করি ফ্রেমওয়ার্কটি কিছু প্রাথমিক এবং উন্নত বৈশিষ্ট্যগুলি (যেমন অপরিবর্তনীয় সংগ্রহ, ফিল্টার, মাল্টিম্যাপস ইত্যাদি) মিস করে এবং সেখানেই (উদাহরণস্বরূপ) গুগল সংগ্রহগুলি আসে
জর্ন

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

3
-1 প্রশ্ন "
ইনট স্টোর করার

6

Stringএকটি মানচিত্রে কয়েক মিলিয়ন সঞ্চয় করতে , http://code.google.com/p/flatmap দেখুন


3
+1 আপনি কীভাবে এটি বাড়িয়েছেন তা উপস্থাপন করতে পারেন?
ক্লার্ক বাও

1
ইন্টারনেটে কোথাও ফ্ল্যাটম্যাপ লেখকের ব্লগ পোস্ট থাকতে হবে।
akuhn


3

ConcurrentHashMap সেইসাথে java.util.concurrentপ্যাকেজ, উল্লেখ করা উচিত যদি একাধিক থ্রেডের মধ্যে HashMap ব্যবহারের পরিকল্পনা। ছোট মেমরির পদচিহ্ন অনুমিত হয়, যেহেতু এটি স্ট্যান্ডার্ড জাভা অংশ।


3

কীভাবে আমরা "দক্ষ" সংজ্ঞায়িত করি তার উপর নির্ভর করে।

প্রতিটি ডেটা স্ট্রাকচারের পড়ার, লেখার, পুনরাবৃত্তি করার, মেমরির পদচিহ্ন ইত্যাদির জন্য নিজস্ব বিগ-ওহ আচরণ রয়েছে one এবং একটি হ্যাশ মানচিত্র লিঙ্কযুক্ত তালিকা ও (এন) এর চেয়ে ও (1) পড়ার জন্য দ্রুত হবে।

কিন্তু যখন আমি "সবচেয়ে দরকারী বিনামূল্যে জাভা লাইব্রেরিগুলি" প্রশ্নের উত্তরগুলি পড়ি? আমি লক্ষ্য করেছি যে ট্রভের উল্লেখ খুব কমই করা হয়েছে।

এটি "সবচেয়ে দক্ষ" এর মতো শোনাচ্ছে না। এটি আমার কাছে "সর্বাধিক জনপ্রিয়" বলে মনে হচ্ছে।

কেবল কিছু প্রতিক্রিয়া - আমি এটি সম্পর্কে কখনও শুনিনি, এবং এটি ব্যবহার করে এমন কাউকে আমি চিনি না। জেডিকে, গুগল বা অ্যাপাচি কমন্সে নির্মিত সংগ্রহগুলি আমার কাছে সুপরিচিত।


3

ট্র্যাভ কয়েকটি সুবিধা দেয়।

  • ছোট মেমরি পদচিহ্ন, এটি মানচিত্র ব্যবহার করে না nt
  • আপনি মানচিত্রের জন্য কীগুলির পরিবর্তে হ্যাশ কৌশলগুলি ব্যবহার করতে পারেন, এটি স্মৃতি সাশ্রয় করে এবং এর অর্থ প্রতিবার যখন আপনি কোনও নতুন বৈশিষ্ট্যের নতুন সেটে কোনও বস্তুকে ক্যাশে রাখতে চান তখন আপনাকে একটি নতুন কী সংজ্ঞায়িত করতে হবে না means
  • এটিতে আদিম সংগ্রহের প্রকার রয়েছে
  • মনে হয় এটির অভ্যন্তরীণ পুনরুদ্ধারের কিছু রূপ রয়েছে

এটি বলেছিল, ট্রভ লেখা হওয়ার পর থেকে জেডি কে সংগ্রহের উন্নতি করার জন্য অনেক কিছু করা হয়েছে।

এটি হ্যাশিং কৌশলগুলি যা এটিকে আমার কাছে আকর্ষণীয় করে তোলে যদিও ... গুগলের জন্য ট্রভ এবং তাদের সংক্ষিপ্ত বিবরণ পড়ুন Google


2

আপনি যদি একটি হ্যাশ টেবিলে কয়েক মিলিয়ন রেকর্ড সঞ্চয় করতে চান তবে সম্ভাবনা হ'ল আপনি মেমরির সমস্যার মধ্যে চলে যাবেন। উদাহরণস্বরূপ, যখন আমি ২৩.৩ মিলিয়ন স্ট্রিং অবজেক্ট সহ একটি মানচিত্র তৈরি করার চেষ্টা করেছি তখন এটি আমার ক্ষেত্রে ঘটেছিল। আমি সঙ্গে গিয়েছিলাম BerkeleyDB , যা খুবই পরিপক্ক এবং সঞ্চালিত হয় ভাল। তাদের একটি জাভা এপিআই রয়েছে যা সংগ্রহগুলি এপিআইকে মোড় দেয়, আপনি খুব সহজেই খুব কম মেমরির পদক্ষেপ সহ নির্বিচারে বড় মানচিত্র তৈরি করতে পারেন। অ্যাক্সেস যদিও ধীর হবে (এটি ডিস্কে সঞ্চিত রয়েছে)।

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


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