A lot of testing and feedback on this one is needed, in order to improve the way it is done.
Summary : - trace can be dumped on disk while parsing - data can be restored, loading only in memory the part of trace we want to display (by time and by containers). - a light preview version of the whole trace can be displayed, allowing to chose the interval and actually load data from it How it works : - allow Serialization of IntervalOfContainers to the disk while parsing. Each finished IntervalOFContainer (containing 10000 states or links) can be dumped to the disk, using Boost serialization library, in a separate file, then its memory is freed, allowing to parse huge files (tested with 8Gb). Each type, container, linked in the IntervalOfContainer is assigned a unique id to avoid serializing too much data (file Serializer.hpp). If Boost with gzip is used, the resulting data is compressed. This is handled by Several SerializerWriter threads, and the assignment to each thread is done by a Singleton object, the SerializerDispatcher. The number of threads used is the number of CPUs found in the machine. At the end of parsing all remaining loaded intervalOfContainers are dumped. File naming is "Unique ID of the container"_"IntervalOfContainer index in the container". They are saved in a folder named after the trace file, without extension. At the end of dumping, we have a folder containing many files. A file called "name of the trace".vite is created in this folder, which handles all containers, types, with their unique IDs. For each IntervalOFContainer of each Container, the beginning and end timings are also saved. This file will be used to correlate data from the multiple IntervalOfContainers files. It stores also the sum of all the times of all StateTypes encountered in each intervalOFContainers. - we can now open this .vite file. A ParserSplitted is then used, allowing to restore the structure of the trace and all types. - If the -t option is specified with a time interval, data is directly reloaded from the serialized files, loading in memory only the intervalofcontainers in the time interval. - If the -t option was not specified, we load the preview version of the trace, contained in the .vite file. The preview version only stores states for the moment. When browsing the preview version, user can select a zone and press ctrl. This opens a new vite window, with the same zoom, but the data is then loaded from the serialized files. How to use : needed libraries : libboost_serialization, libboost_thread, and libboost_iostreams . These libraries are in the standard boost package. In linux, they include the gzip library needed for compression and bindings. In windows, this library is not included and has to be included after, and boost recompiled. - cmake : activate the option VITE_ENABLE_SERIALIZATION in order to check for boost libraries, and to add corresponding files - configure : add the flag --use_boost if libraries are in /usr/lib, --boost_libdir=$dir else. - by hand in the src.pro file : add needed libraries ( -lboost_serialization -lboost_thread -lboost_iostreams ) and flags USE_ITC, BOOST_SERIALIZE, and BOOST_GZIP to activate everything todo: - make preview + -c option work together ( -c and -t work together for the moment, -c and preview also, but not when loading actual data from disk) - add other data to the preview (links events and variables) - check if using lots of threads to compress is really useful - better balance between those threads, without rebinding qt signal/slots each time - tests, tests and tests. - documentation and comments.
Showing with 4065 additions and 165 deletions