Tessil/hat-trie

iterator size

suhrig opened this issue · 1 comments

Hello,

I just found your implementation of a HAT-tree map and already love it. I use strings as keys and structs as values, and it is faster than a std::map / std::unordered_map for my use case and more memory efficient. However, I noticed that the iterators are a lot bigger than that of a std::map: 72 bytes compared to just 8 bytes for an iterator of a std::map. My software needs to remember the locations of a ton of items, so the bigger the size of a single iterator, the more memory is consumed. With a std::map, I can instruct my software to remember the items using a vector of iterators. I can easily retrieve the keys using i->first and the values using i->second. When I use htrie_map, the vector of iterators grows substantially, because the individual iterators are so big. Is there a more memory efficient way to store a list of locations, which lets me retrieve both the key and the value? Are there more lightweight iterators? Or pointers to items of the htrie_map from which key and value can be reconstructed? Simple pointers to the values are not an option, because I also need the key.

Many thanks in advance,
Sebastian

Hi,

Effectively I didn't really optimize the size of the iterators. It could be possible to reduce its size a bit but not by much I think.

Introducing a way to remember a position in a lightweight fashion and recreate an iterator from there could be a good way to go. It would still need at least 16 bytes on a 8-byte pointer platform, maybe more, as I need to at least remember the position in the hash map + the node containing the hash map.

I will see what can be done and come back to you.

Thibaut