Memory overhead#

The file parsing functionality of kinisi includes a user-definable memory ceiling, which may result in you seeing the following error:

>>> diff = DiffusionAnalyzer.from_Universe(my_universe, parser_params=p_params)
MemoryError: The memory limit of this job is 8.0e0 GB but the displacement values will use 9.0e0 GB. 
Please either increase the memory_limit or decrease the sampling rate (see https://kinisi.readthedocs.io/en/latest/memory_limit.html).

This reason for this ceiling is that for each timestep investigated, kinisi will produce an array of displacements, the shape of which is given by [atom, displacement observation, dimension], which are stored in a list. This means that for a simulation of say 1 000 atoms for 1 000 picoseconds which is analysed with a minimum timestep of 10 picoseconds, the first, and largest, item in the list of arrays will have a size of 3 000 000 floating-point numbers (specifically float64), each of which is 8 bytes in size. Therefore, if a user has a very long simulation, the size of this list might end up much larger than the available RAM on the system, causing a crash.

The default ceiling is 8 gigabytes, but this can be changed by adding a memory_limit item to the parser_params dictionary, for example:

>>> p_params = {'specie': 'Li',
                'time_step': 2.0,
                'step_skip': 50,
                'min_obs': 50, 
                'memory_limit': 16.}

Alternatively, for example, if you reach the maximum memory limit of your machine, you can use sub-sampling approaches to reduce the number of observations. For example, you can limit either the number of atoms used in the analysis, using the sub_sample_atoms keyword argument, or the number of timesteps that are read in, using the sub_sample_traj keyword argument. For a long simulation, start these both with large numbers and gradually decrease them until the resulting uncertainty in the mean-squared displacements or diffusion coefficient is acceptable.