/home/niits/anaconda3/envs/table_reconstruct/lib/python3.7/site-packages/ipykernel_launcher.py -f /home/niits/.local/share/jupyter/runtime/kernel-d97106cb-6372-4e38-9212-d505c854cc7a.json
The flame graphs shows the callstacks responsible for allocations at peak.
The wider (and the redder) the bar, the more memory was allocated by that function or its callers. If the bar is 100% of width, that's all the allocated memory.
The first graph shows the normal callgraph: if main() calls g() calls f(), let's say, then main() will be at the top. The second graph shows the reverse callgraph, from f() upwards.
Why is the second graph useful? If f() is called from multiple places, in the first graph it will show up multiple times, at the bottom. In the second reversed graph all calls to f() will be merged together.
Need help reducing your data processing application's memory use? Check out tips and tricks here.