# Configuration
## Configuration via config files
**R5py** can be configured using a configuration file `r5py.yml`, for which the
package searches in the following paths:
- On Unix-like operating systems (such as most Linux and BSD distributions,
as well as MacOS):
- `${XDG_CONFIG_HOME}/r5py.yml` or `~/.config/r5py.yml` for per-user
configuration (if both files exist, only the former is read)
- `/etc/r5py.yml` for system-wide configuration (user config overrides system
config)
- On Windows operating systems:
- `%APPDATA%\\r5py.yml`. The precise path of the `%APPDATA%` directory depends
on your user name and locale (enter `%APPDATA%` in a Windows Explorer’s search
bar to navigate to it).
## Configuration from the command line
When running **r5py** from the command line, you can supply command line arguments.
To show available options, consult the [table below](#configuration-command-line-options), or run:
```bash
python -m r5py --help
```
## Using command line options in a script or notebook
If you use **r5py** in a script, or run it from a notebook and don’t want to rely on a
configuration file, you can set command line arguments *before* importing r5py::
```python
import sys
sys.argv.append(["--max-memory", "12G"])
import r5py
```
From the [table below](#configuration-command-line-options) , look up the available
options from the *command line argument* column.
## Configuration/command line options
configuration file option | command line argument | explanation | default value
------------------------- | -------------------------- | -------------------------------- | ---------------------------------
`max-memory: [value]` | `--max-memory [value],`
`-m [value]` | Set the limit for the Java Virtual Machine’s heap size (`-Xmx`). This option accepts either absolute values (integer or decimal), optionally with a suffix to indicate Mibibytes, Gibibytes, or Tebibytes: `M`, `G`, `T`), or relative, expressed in a percentage of total memory, with a `%` suffix. | `80%`
`r5-classpath: [classpath]` | `--r5-classpath [classpath],`
`-r [classpath]` | Point to R5’s JAR (or build directory) in case you want to use a custom R5 installation. | `/usr/share/java/r5/r5-all.jar`
`verbose: [boolean]` | `--verbose`, `-v` | Show more detailed output | `False` in configuration file, not specified on commandline
## Setting the maximum Java heap size (memory use)
A *Java Virtual Machine* (JVM) typically restricts the memory usage of programs it runs.
More specifically, the *heap size* can be limited (see
[this stackoverflow discussion](https://stackoverflow.com/questions/14763079/what-are-the-xms-and-xmx-parameters-when-starting-jvm)
for details).
The tasks carried out by **R5** under the hood of **r5py** are fairly memory-intensive,
which is why, by default, r5py allows the JVM to grant up to 80% of total memory to R5
(but always leaving at least 2 GiB to the system and other processes).
You might want to lower this limit if you are running other tasks in parallel, or raise
it, if you have a dedicated computer with large memory and small operating system
requirements.
As outlined above, you can either create a configuration file, and set `max-memory`
there, specify the `--max-memory` or `-m` command line arguments, or add the same
arguments to `sys.argv`.
For instance, to set the maximum heap size to a fixed 12 GiB, you can create a
configuration file in the [location suitable for your operating
system](#configuration-via-config-files), and add the following line:
```yaml
max-memory: 12G
```
## Using a custom installation of R5
For some use cases, it can be useful to use a local copy of **R5**, rather than the one
downloaded by **r5py**, for instance, in order to apply custom patches to extend or
modify R5’s functionality, or to force the use of a certain version for longitudinal
comparability.
This can be achieved by either installing R5 into the default class path
`/usr/share/java/r5/r5-all.jar`, or by using a configuration option or command line
argument to change the class path.
For example, to set a custom classpath inside a Python notebook, you can set `sys.argv`
before importing `r5py`:
```python
import sys
sys.argv.append(["--r5-classpath", "/opt/r5/"])
import r5py
```