c++ - Best STL containers to avoid heap fragmentation -
i have program analyzes 150,000 files. valgrind reports no memory leak program slows on time.
some of problems related using std::string , mktime taking time. (see c++ slows on time reading 70,000 files)
but still slows down on time. lotharyx suggested container usage causing heap fragmentation.
i read various flow charts on pros , cons of different stl containers didn't quite it.
in pseudo code below, i'm not sure i've made right choices avoid heap fragmentation.
filelist.clear() scan disks , build "filelist", std::set of file paths matching pattern. // filepaths named date, eg 20160530.051000, intrinsically ordered foreach(filepath in filelist) { if (alreadyhavefiledetails(filepath)) continue; // otherwise collect file details fileinfostruct; // size, contents, mod fileinfomap[time_t date] = fileinfostruct; } // fileinfomap ordered collection of information structs of 100,000 files // traverse list in order foreach (fileinfo in fileinfomap) { if (meetscondition(fileinfo)) { teventinfo event = makeeventinfo() eventlist.push_back(event); } }
and above sequence repeats forever.
so choice of containers, i've used (or need):
filelist
-- list of unique strings containing 150,000 pathnames.
chose std::set because it automatically handles duplicates , maintains sort order automatically. no random access, add entries, sort them (manually or automatically), , iterate on them.
fileinfomap
-- array of structures keyed time_t timestamp corresponding date of file. chose std::map. have 150,000 entries occupies lot of memory. no random access, add entries 1 end. must iterate on them and, if necessary, delete entries middle.
eventlist
-- small list of "event" structures, 50 items. chose std::vector. not sure why really. no random access, add entries 1 end , later iterate on collection.
i'm new c++. consideration.
about memory management, container belongs 2 large families: 1 allocate elements together, , 1 allocate elements separately.
vector , deque belong first family, list, set , map second.
memory fragmentation arises when elements continuously added , removed container not supporting global relocation.
one way avoid problem use vector
s, using "reserve
" anticipate memory need reduce relocations, , keeping data sorted upon insertion.
another way use "linking based container" (like list, set etc.) providing them allocator allocate memory larger chunks, recycling them instead of calling raw malloc/free every single element insert/remove.
give std::allocator
you can write allocator deriving std::allocator , overriding allocate
/deallocate
functions adding required logic, , passing yourallocator
optional template parameter of container use.
Comments
Post a Comment