Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7772713
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 1, 20262026-06-01T16:56:39+00:00 2026-06-01T16:56:39+00:00

I have store 111 million key-value pairs (one key can have multiple values –

  • 0

I have store 111 million key-value pairs (one key can have multiple values – maximum 2/3) whose key are 50 bit Integers and values are 32 bit (maximum) Integers. Now, my requirements are:

  1. Fast Insertion of (Key, Value) pair [allowing duplicates]
  2. Fast retrieving of value/values based on key.

A nice solution of it is given here based on MultiMap. However, I want to store more key-values pairs in main memory with no/little bit performance penalty. I studied from web articles that B+ Tree, R+ Tree, B Tree, Compact Multimap etc. can be a nice solution for that. Can anybody help me:

Is there any Java library which satisfies my all those needs properly
(above mentioned/other ds also acceptable. no issue with that) ?
Actually, I want an efficient java library data structure to store/retrieve
key-value/values pairs which takes less memory footprint and must be
built in-memory.

NB: I have tried with HashMultiMap (Guava with some modification with trove) as mentioned by Louis Wasserman, Kyoto/Tokyo Cabinet etc etc.My experience is not good with disk-baked solutions. So please avoid that :). Another point is that, for choosing library/ds one important point is: keys are 50 bit (so if we assign 64bit) 14 bit will lost and values are 32 bit Int (maximum)- mostly they are 10-12-14 bits. So, we can save space there also.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-01T16:56:40+00:00Added an answer on June 1, 2026 at 4:56 pm

    I don’t think there’s anything in the JDK which will do this.

    However, implementing such a thing is a simple matter of programming. Here is an open-addressed hashtable with linear probing, with keys and values stored in parallel arrays:

    public class LongIntParallelHashMultimap {
    
        private static final long NULL = 0L;
    
        private final long[] keys;
        private final int[] values;
        private int size;
    
        public LongIntParallelHashMultimap(int capacity) {
            keys = new long[capacity];
            values = new int[capacity];
        }
    
        public void put(long key, int value) {
            if (key == NULL) throw new IllegalArgumentException("key cannot be " + NULL);
            if (size == keys.length) throw new IllegalStateException("map is full");
    
            int index = indexFor(key);
            while (keys[index] != NULL) {
                index = successor(index);
            }
            keys[index] = key;
            values[index] = value;
            ++size;
        }
    
        public int[] get(long key) {
            if (key == NULL) throw new IllegalArgumentException("key cannot be " + NULL);
    
            int index = indexFor(key);
            int count = countHits(key, index);
    
            int[] hits = new int[count];
            int hitIndex = 0;
    
            while (keys[index] != NULL) {
                if (keys[index] == key) {
                    hits[hitIndex] = values[index];
                    ++hitIndex;
                }
                index = successor(index);
            }
    
            return hits;
        }
    
        private int countHits(long key, int index) {
            int numHits = 0;
            while (keys[index] != NULL) {
                if (keys[index] == key) ++numHits;
                index = successor(index);
            }
            return numHits;
        }
    
        private int indexFor(long key) {
            // the hashing constant is (the golden ratio * Long.MAX_VALUE) + 1
            // see The Art of Computer Programming, section 6.4
            // the constant has two important properties:
            // (1) it is coprime with 2^64, so multiplication by it is a bijective function, and does not generate collisions in the hash
            // (2) it has a 1 in the bottom bit, so it does not add zeroes in the bottom bits of the hash, and does not generate (gratuitous) collisions in the index
            long hash = key * 5700357409661598721L;
            return Math.abs((int) (hash % keys.length));
        }
    
        private int successor(int index) {
            return (index + 1) % keys.length;
        }
    
        public int size() {
            return size;
        }
    
    }
    

    Note that this is a fixed-size structure. You will need to create it big enough to hold all your data – 110 million entries for me takes up 1.32 GB. The bigger you make it, in excess of what you need to store the data, the faster that insertions and lookups will be. I found that for 110 million entries, with a load factor of 0.5 (2.64 GB, twice as much space as needed), it took on average 403 nanoseconds to look up a key, but with a load factor of 0.75 (1.76 GB, a third more space than is needed), it took 575 nanoseconds. Decreasing the load factor below 0.5 usually doesn’t make much difference, and indeed, with a load factor of 0.33 (4.00 GB, three times more space than needed), i get an average time of 394 nanoseconds. So, even though you have 5 GB available, don’t use it all.

    Note also that zero is not allowed as a key. If this is a problem, change the null value to be something else, and pre-fill the keys array with that on creation.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have to store more than 100 millions of key-values in my HashMultiMap (key
I have to store more than 100 millions of key-values in my HashMultiMap (key
I have to store more than 100 millions of key-values in my HashMultiMap (key
I have store one value in one variable and second in other, now i
I have to store blog style comments in a database. Each comment can have
I have to store the value of the display property of an element (
i have stored two ip address values in two strings a = '116.95.123.111' b
I have to store date values ( TDateTime ) in a string format. What
I have this XML <data> <peptides> <peptide> <accession>111</accession> <sequence>AAA</sequence> <score>4000</score> </peptide> <peptide> <accession>111</accession> <sequence>AAA</sequence>
I have a single user java program that I would like to have store

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.