##### Contents

back to iatexture

# Function rldesc

## Synopse

The rldesc function computes the run length descriptors.

• rl,g = rldesc(f,theta=0,phi=0,mask = [])
• Output
• g: list of descriptors computed from the run length.
• rl: run length matrix (gray level x run length)
• Input
• f: input ndarray, 2D, square.
• teta: angle (rad) in which the run length matrix must be computed.
• phi: other angle (rad) in which the run length matrix must be computed (3D cases).

## Description

The rldesc function computes the descriptors based on the run length matrix.

## Function Code

```001. def iarl(f,theta=0,phi=0):
002.     import numpy as np
003.     from morph import *
004.     from iatexture.rldesc_c import rl
005.
006.     mmfreedom(2)
007.
008.     if len(f.shape)==2: # 2D input
009.
010.         if theta == np.pi/4: #rl right diagonal
011.             ee = np.array([[0,0,1],[0,1,0],[1,0,0]]).astype(bool)
012.             #ee = np.ones((1,3)).astype(bool)
013.         elif theta == np.pi/2: # run lengh vertical
014.             ee = np.ones((3,1)).astype(bool)
015.         elif theta == 3*np.pi/4:#rl left diagonal
016.             ee = np.array([[1,0,0],[0,1,0],[0,0,1]]).astype(bool)
017.         else:# default option: horizontal run length
018.             ee = np.ones((1,3)).astype(bool)
019.     else: # 3D images
020.         if theta == np.pi/4:
021.             if phi == np.pi/4: #(45,45)
022.                 ee = array([[[0,0,1],[0,0,0],[0,0,0]],
023.                             [[0,0,0],[0,1,0],[0,0,0]],
024.                             [[0,0,0],[0,0,0],[1,0,0]]]).astype(bool)
025.             elif phi == np.pi/2: #(45,90)
026.                 ee = array([[[0,0,0],[0,0,0],[0,0,0]],
027.                             [[0,0,1],[0,1,0],[1,0,0]],
028.                             [[0,0,0],[0,0,0],[0,0,0]]]).astype(bool)
029.             elif phi == 3*np.pi/4: #(45,135)
030.                 ee = array([[[0,0,0],[0,0,0],[1,0,0]],
031.                             [[0,0,0],[0,1,0],[0,0,0]],
032.                             [[0,0,1],[0,0,0],[0,0,0]]]).astype(bool)
033.         elif theta == np.pi/2:
034.             if phi == np.pi/4: #(90,45)
035.                 ee = array([[[0,0,0],[0,0,0],[0,1,0]],
036.                             [[0,0,0],[0,1,0],[0,0,0]],
037.                             [[0,1,0],[0,0,0],[0,0,0]]]).astype(bool)
038.             elif phi == np.pi/2: #(90,90)
039.                 ee = array([[[0,0,0],[0,0,0],[0,0,0]],
040.                             [[0,1,0],[0,1,0],[0,1,0]],
041.                             [[0,0,0],[0,0,0],[0,0,0]]]).astype(bool)
042.             elif phi == 3*np.pi/4: #(90,135)
043.                 ee = array([[[0,1,0],[0,0,0],[0,0,0]],
044.                             [[0,0,0],[0,1,0],[0,0,0]],
045.                             [[0,0,0],[0,0,0],[0,1,0]]]).astype(bool)
046.         elif theta == 3*np.pi/4:
047.             if phi == np.pi/4: #(135,45)
048.                 ee = array([[[0,0,0],[0,0,0],[0,0,1]],
049.                             [[0,0,0],[0,1,0],[0,0,0]],
050.                             [[1,0,0],[0,0,0],[0,0,0]]]).astype(bool)
051.             elif phi == np.pi/2: #(135,90)
052.                 ee = array([[[0,0,0],[0,0,0],[0,0,0]],
053.                             [[1,0,0],[0,1,0],[0,0,1]],
054.                             [[0,0,0],[0,0,0],[0,0,0]]]).astype(bool)
055.             elif phi == 3*np.pi/4: # (135,135)
056.                 ee = array([[[1,0,0],[0,0,0],[0,0,0]],
057.                             [[0,0,0],[0,1,0],[0,0,0]],
058.                             [[0,0,0],[0,0,0],[0,0,1]]]).astype(bool)
059.         else: # default option theta = 0
060.             if phi == np.pi/4:# (0,45)
061.                 ee = array([[[0,0,0],[0,0,1],[0,0,0]],
062.                             [[0,0,0],[0,1,0],[0,0,0]],
063.                             [[0,0,0],[1,0,0],[0,0,0]]]).astype(bool)
064.             elif phi == np.pi/2: # (0,90)
065.                 ee = array([[[0,0,0],[0,0,0],[0,0,0]],
066.                             [[0,0,0],[1,1,1],[0,0,0]],
067.                             [[0,0,0],[0,0,0],[0,0,0]]]).astype(bool)
068.             elif phi == 3*np.pi/4: #(0,135)
069.                 ee = array([[[0,0,0],[1,0,0],[0,0,0]],
070.                             [[0,0,0],[0,1,0],[0,0,0]],
071.                             [[0,0,0],[0,0,1],[0,0,0]]]).astype(bool)
072.             else:# straight up (0,0)
073.                 ee = array([[[0,0,0],[0,1,0],[0,0,0]],
074.                             [[0,0,0],[0,1,0],[0,0,0]],
075.                             [[0,0,0],[0,1,0],[0,0,0]]]).astype(bool)
076.
077.     fr = mmlabelflat(f,ee)
078.
079.     #nc = mmgrain(fr,f,'mean','data').astype(uint8)
080.     #cc = mmblob(fr,'area','data')
081.
082.     u, indices = np.unique(np.ravel(fr),return_index=True)
083.     f = np.ravel(f)
084.     nc =  f[int_(indices)] # check the gray level of each blob
085.
086.     y = np.bincount(np.ravel(fr))
087.     ii = np.nonzero(y)[0]
088.     cc = y[ii] # check the size of each blob
089.
090.     result = rl(f,nc.astype(int32),cc.astype(int32))
091.
092.     #result = np.zeros((f.max()+1, max(unique(cc))))
093.     #for i,j in zip(int_(nc),cc):
094.     #    result[i,j-1]+=1
095.     return result*1.0
096.
098.     import numpy as np
100.         aux = f.copy()
101.         new_v = aux[mask].max() +1# value that the pixels outside the mask must assume
103.         rl = iarl(aux,theta,phi)*1.0
104.         #print new_v,rl.shape
105.         # extract the lines and columns that corresponds to pixels outside the mask with value new_v
106.         rl = rl[:-1,:]# extract the row that represents the pixels out of the mask
107.         rl = rl[:,:np.argwhere(np.sum(rl,axis=0)>0).max()+1]
108.         # in some cases, some different lengths of runs are added in this operation
109.         # on those cases, besides to extracted the row corresponds to new_v
110.         # it must be extracted the columns added in this operations (i.e. all null columns in the end of the matrix)
111.
112.     else:
113.         rl = iarl(f,theta,phi)
114.     C = rl.sum()
115.     i,j = np.indices(rl.shape)+1
116.     # compute descriptors
117.     ShrtREmph = ((rl/(j*j)).sum())/C
118.     LngREmph = ((rl*(j*j)).sum())/C
119.     GLevNonUni = (rl.sum(axis=1)*rl.sum(axis=1)).sum()/C
120.     RLNonUni = (rl.sum(axis=0)*rl.sum(axis=0)).sum()/C
121.     Fraction = C/((rl*j).sum())
122.     return rl,[RLNonUni,GLevNonUni,LngREmph,ShrtREmph,Fraction]```

## Examples

### Numerical example:

Run Length Matrix

In the example below, there are 7 runs: 4 runs of length 1 - with values 5, 3, 0 and 2. There are 3 runs of length 2 - 2 with values 1 and 1 with value 5. The matrix has 6 rows, representing the levels and 2 columns representing the length of the runs:

```1. from rldesc import iarl
2.
3. f = array([
4.    [1,1,5,3,0],
5.    [1,1,5,5,2]])
6. print 'Input image'
7. print f
8. print 'Run Length Matrix'
9. print iarl(f)```
```Input image
[[1 1 5 3 0]
[1 1 5 5 2]]
Run Length Matrix
[[ 1.  0.]
[ 0.  2.]
[ 1.  0.]
[ 1.  0.]
[ 0.  0.]
[ 1.  1.]]
```

From the Run Length Matrix, one can extract the descriptors:

```1. from rldesc import rldesc
2. print 'Run Length Matrix'
3. print iarl(f)
4. print 'Run Length Matrix Descriptors:'
5. print rldesc(f)```
```Run Length Matrix
[[ 1.  0.]
[ 0.  2.]
[ 1.  0.]
[ 1.  0.]
[ 0.  0.]
[ 1.  1.]]
Run Length Matrix Descriptors:
(array([[ 1.,  0.],
[ 0.,  2.],
[ 1.,  0.],
[ 1.,  0.],
[ 0.,  0.],
[ 1.,  1.]]), [3.5714285714285716, 1.5714285714285714, 2.2857142857142856, 0.6785714285714286, 0.69999999999999996])
```
```1. f = array( [[0,1,1,0,0,0,0,0,0],
2.             [1,0,0,0,0,0,0,1,0],
3.             [1,0,0,1,0,0,0,1,0],
4.             [0,0,0,0,0,1,1,0,0]], dtype=uint8)
5. print 'matriz comprimento de corrida'
6. rl,desc = rldesc(f,pi/2)
7. print rl
8. print 'descritores extraidos da Matrix comprimento de corrida:\n', desc```
```matriz comprimento de corrida
[[ 5.  1.  4.  2.]
[ 5.  2.  0.  0.]]
descritores extraidos da Matrix comprimento de corrida:
[6.7894736842105265, 10.157894736842104, 4.7368421052631575, 0.59576023391812871, 0.52777777777777779]
```

### Numerical example 2:

```1. from rldesc import iarl,rldesc
2.
3. f = array([
4.    [1,1,0,0,0],
5.    [1,1,8,0,2]])
6. print 'matriz comprimento de corrida'
7. rl,desc = rldesc(f,mask = f>0)
8. print rl
9. print 'Descritores extraidos da Matrix comprimento de corrida:\n',desc```
```matriz comprimento de corrida
[[ 0.  0.]
[ 0.  2.]
[ 1.  0.]
[ 0.  0.]
[ 0.  0.]
[ 0.  0.]
[ 0.  0.]
[ 0.  0.]
[ 1.  0.]]
Descritores extraidos da Matrix comprimento de corrida:
[2.0, 1.5, 2.5, 0.625, 0.66666666666666663]
```

```01. from rldesc import iarl,rldesc
02.
03. f = array([
04.    [1,1,0,0,9],
05.    [1,1,8,0,9],
06.    [1,0,8,0,9],
07.    [9,9,9,9,9]])
08. print 'matriz comprimento de corrida'
09. rl,desc = rldesc(f,mask = f<9)
10. print rl
11. print 'Descritores extraidos da Matrix comprimento de corrida:\n',desc```
```matriz comprimento de corrida
[[ 3.  1.]
[ 1.  2.]
[ 0.  0.]
[ 0.  0.]
[ 0.  0.]
[ 0.  0.]
[ 0.  0.]
[ 0.  0.]
[ 2.  0.]]
Descritores extraidos da Matrix comprimento de corrida:
[5.0, 3.2222222222222223, 2.0, 0.75, 0.75]
```
```01. from rldesc import iarl,rldesc
02.
03. f = array([
04.    [1,0,0,0,1,0],
05.    [0,1,8,1,1,1],
06.    [2,2,2,8,2,8],
07.    [0,1,8,1,1,1],
08.    [9,9,9,9,9,9],
09.    [1,1,1,0,8,1]])
10. print 'matriz comprimento de corrida'
11. rl,desc = rldesc(f,mask = f<9)
12. print rl
13. print 'Descritores extraidos da Matrix comprimento de corrida:\n',desc
14. print
15. print```
```matriz comprimento de corrida
[[ 4.  0.  1.]
[ 5.  0.  3.]
[ 1.  0.  1.]
[ 0.  0.  0.]
[ 0.  0.  0.]
[ 0.  0.  0.]
[ 0.  0.  0.]
[ 0.  0.  0.]
[ 5.  0.  0.]]
Descritores extraidos da Matrix comprimento de corrida:
[12.5, 5.9000000000000004, 3.0, 0.77777777777777779, 0.66666666666666663]
```

## 3D examples

```01. import numpy as np
02.
03. f = np.array([
04.        [[1,2,2,0,0,1],[0,0,1,2,2,1],[1,1,0,0,0,2],[1,1,1,2,2,2],[1,1,2,2,0,0]],
05.        [[1,2,2,0,0,1],[0,0,1,2,2,1],[1,1,0,0,0,2],[1,1,1,2,2,2],[1,1,2,2,0,0]],
06.        [[1,2,2,0,0,1],[0,0,1,2,2,1],[1,1,0,0,0,2],[1,1,1,2,2,2],[1,1,2,2,0,0]]], dtype=np.uint8)
07. print 'input array \n',f
08. rl,desc = rldesc(f) # orientation straight up
09. print 'rl: \n', rl
10. print 'Run Length Descriptors\n',desc```
```input array
[[[1 2 2 0 0 1]
[0 0 1 2 2 1]
[1 1 0 0 0 2]
[1 1 1 2 2 2]
[1 1 2 2 0 0]]

[[1 2 2 0 0 1]
[0 0 1 2 2 1]
[1 1 0 0 0 2]
[1 1 1 2 2 2]
[1 1 2 2 0 0]]

[[1 2 2 0 0 1]
[0 0 1 2 2 1]
[1 1 0 0 0 2]
[1 1 1 2 2 2]
[1 1 2 2 0 0]]]
rl:
[[  0.   0.   9.]
[  0.   0.  11.]
[  0.   0.  10.]]
Run Length Descriptors
[30.0, 10.066666666666666, 9.0, 0.11111111111111112, 0.33333333333333331]
```

### Other directions

```1. rl,desc = rldesc(f,theta=np.pi/4,phi=np.pi/4) # orientation (45,45)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 27.   0.   0.]
[ 18.   6.   1.]
[ 19.   4.   1.]]
Run Length Descriptors [55.263157894736842, 25.394736842105264, 1.6052631578947369, 0.87792397660818722, 0.84444444444444444]
```
```1. rl,desc = rldesc(f,theta=np.pi/4,phi=np.pi/2) # orientation (45,90)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 27.   0.   0.]
[ 12.   6.   3.]
[ 15.   3.   3.]]
Run Length Descriptors [43.956521739130437, 23.347826086956523, 2.0869565217391304, 0.8248792270531401, 0.76666666666666672]
```
```1. rl,desc = rldesc(f,theta=np.pi/4,phi=3*np.pi/4) # orientation (45,135)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 27.   0.   0.]
[ 18.   6.   1.]
[ 19.   4.   1.]]
Run Length Descriptors [55.263157894736842, 25.394736842105264, 1.6052631578947369, 0.87792397660818722, 0.84444444444444444]
```
```1. rl,desc = rldesc(f,theta=np.pi/2,phi=np.pi/4) # orientation (90,45)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 27.   0.   0.]
[ 15.   6.   2.]
[ 22.   4.   0.]]
Run Length Descriptors [55.263157894736842, 25.44736842105263, 1.6052631578947369, 0.87792397660818722, 0.84444444444444444]
```
```1. rl,desc = rldesc(f,theta=np.pi/2,phi=np.pi/2) # orientation (90,90)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 27.   0.   0.]
[  9.   3.   6.]
[ 18.   6.   0.]]
Run Length Descriptors [43.956521739130437, 23.608695652173914, 2.0869565217391304, 0.82487922705314021, 0.76666666666666672]
```
```1. rl,desc = rldesc(f,theta=np.pi/2,phi=3*np.pi/4) # orientation (90,135)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 27.   0.   0.]
[ 15.   6.   2.]
[ 22.   4.   0.]]
Run Length Descriptors [55.263157894736842, 25.44736842105263, 1.6052631578947369, 0.87792397660818722, 0.84444444444444444]
```
```1. rl,desc = rldesc(f,theta=3*np.pi/4,phi=np.pi/4) # orientation (135,45)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 23.   2.]
[ 21.   6.]
[ 22.   4.]]
Run Length Descriptors [57.692307692307693, 26.025641025641026, 1.4615384615384615, 0.88461538461538458, 0.8666666666666667]
```
```1. rl,desc = rldesc(f,theta=3*np.pi/4,phi=np.pi/2) # orientation (135,90)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 21.   3.]
[ 15.   9.]
[ 18.   6.]]
Run Length Descriptors [45.0, 24.0, 1.75, 0.8125, 0.80000000000000004]
```
```1. rl,desc = rldesc(f,theta=3*np.pi/4,phi=3*np.pi/4) # orientation (135,135)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[ 23.   2.]
[ 21.   6.]
[ 22.   4.]]
Run Length Descriptors [57.692307692307693, 26.025641025641026, 1.4615384615384615, 0.88461538461538458, 0.8666666666666667]
```
```1. rl,desc = rldesc(f,theta=0,phi=np.pi/4) # orientation (0,45)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[  8.   8.   1.]
[ 18.   6.   1.]
[ 11.   8.   1.]]
Run Length Descriptors [30.032258064516128, 21.193548387096776, 2.4516129032258065, 0.69086021505376349, 0.68888888888888888]
```
```1. rl,desc = rldesc(f,theta=0,phi=np.pi/2) # orientation (0,90)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[  0.   9.   3.]
[ 12.   6.   3.]
[  3.   9.   3.]]
Run Length Descriptors [18.375, 16.875, 4.0, 0.45833333333333331, 0.53333333333333333]
```
```1. rl,desc = rldesc(f,theta=0,phi=3*np.pi/4) # orientation (0,135)
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[  8.   8.   1.]
[ 18.   6.   1.]
[ 11.   8.   1.]]
Run Length Descriptors [30.032258064516128, 21.193548387096776, 2.4516129032258065, 0.69086021505376349, 0.68888888888888888]
```

```1. rl,desc = rldesc(f,mask = f!=1) # orientation straight up
2. print 'rl: \n', rl
3. print 'Run Length Descriptors',desc```
```rl:
[[  0.   0.   9.]
[  0.   0.   0.]
[  0.   0.  10.]]
Run Length Descriptors [19.0, 9.526315789473685, 9.0, 0.11111111111111112, 0.33333333333333331]
```

## Equations

Let be the number of times there is a run of length having grey level . Let be the number of grey levels and be the number of runs.

## Contributions

• Mariana Bento, 21oct2013: initial function.
• Mariana Leite, 09sept2014: 3D masks;3D examples

## Memory test

```01. import multiprocessing as mp
02. import numpy as np
03. import psutil
04. from ia636 import iacontour,iameshgrid,iaroi,iagshow
05. import glob, urllib, os
06. from rldesc import iarl,rldesc
07. import time
08. import dicom
09.
10. foldername = '/awmedia/www/media/p/LesionMRI/CAINdata/Original_Data/CAIN10320013/BASELINE - CAIN1/FLAIR_LongTR_601/*'
11. folder = glob.glob(foldername)
12. folder.sort()
13.
14. img = zeros((len(folder),560,560),dtype=uint8)
15.
16. for i in arange(len(folder)):
18.      img[i] = aux.pixel_array.astype(float32)
19.
20. # retalhar a imagem em retangulos
21. sizex = 70
22. sizey = 70
23. sizez = 24
24.
25. z = arange(0,img.shape[0],sizez)
26. x = arange(0,img.shape[1],sizex)
27. y = arange(0,img.shape[2],sizey)
28. print 'initial memory use:  %9.3f MB' % (psutil.phymem_usage().used/1e06,)
29. for k in arange(z.shape[0]-1):
30.     for i in arange(x.shape[0]-1):
31.         for j in arange(y.shape[0]-1):
32.             roi = np.zeros(img.shape, dtype = bool)
33.             roi[z[k]:z[k+1],x[i]:x[i+1],y[j]:y[j+1]] =1
34.             print 'memory used before:  %9.3f MB' % (psutil.phymem_usage().used/1e06,)
35.             t1 = time.time()
36.             rl,desc = rldesc(img,mask = roi)
37.             print time.time()-t1
38.             print 'memory used after:  %9.3f MB' % (psutil.phymem_usage().used/1e06,)```
```initial memory use:   1781.105 MB
memory used before:   1781.613 MB
2.91446709633
memory used after:   1798.095 MB
memory used before:   1812.570 MB
2.90717601776
memory used after:   1790.341 MB
memory used before:   1805.324 MB
3.65989780426
memory used after:   1818.784 MB
memory used before:   1803.547 MB
3.14295697212
memory used after:   1790.722 MB
memory used before:   1805.705 MB
2.91689109802
memory used after:   1806.152 MB
memory used before:   1790.661 MB
2.94721698761
memory used after:   1790.026 MB
memory used before:   1804.755 MB
2.89543795586
memory used after:   1805.517 MB
memory used before:   1790.026 MB
2.91798496246
memory used after:   1803.358 MB
memory used before:   1818.849 MB
2.90062904358
memory used after:   1834.594 MB
memory used before:   1819.103 MB
2.94848108292
memory used after:   1791.169 MB
memory used before:   1806.660 MB
2.93183612823
memory used after:   1829.769 MB
memory used before:   1814.278 MB
2.94656705856
memory used after:   1789.518 MB
memory used before:   1804.755 MB
2.93362808228
memory used after:   1822.405 MB
memory used before:   1807.167 MB
2.93124079704
memory used after:   1804.374 MB
memory used before:   1819.865 MB
2.9104039669
memory used after:   1833.071 MB
memory used before:   1817.580 MB
2.92160511017
memory used after:   1810.596 MB
memory used before:   1826.087 MB
2.90441083908
memory used after:   1821.008 MB
memory used before:   1805.517 MB
2.92724299431
memory used after:   1790.026 MB
memory used before:   1804.755 MB
2.90181493759
memory used after:   1812.627 MB
memory used before:   1797.390 MB
2.92057991028
memory used after:   1794.597 MB
memory used before:   1810.088 MB
2.90626502037
memory used after:   1808.564 MB
memory used before:   1793.073 MB
2.92518997192
memory used after:   1789.645 MB
memory used before:   1804.628 MB
3.26671504974
memory used after:   1826.087 MB
memory used before:   1810.342 MB
2.90726995468
memory used after:   1789.510 MB
memory used before:   1805.001 MB
2.90561389923
memory used after:   1805.558 MB
memory used before:   1790.067 MB
2.91861891747
memory used after:   1790.271 MB
memory used before:   1805.255 MB
2.92092609406
memory used after:   1810.207 MB
memory used before:   1794.970 MB
3.38886189461
memory used after:   1793.700 MB
memory used before:   1809.191 MB
3.51570296288
memory used after:   1811.350 MB
memory used before:   1795.858 MB
3.43316292763
memory used after:   1798.271 MB
memory used before:   1813.508 MB
2.90063595772
memory used after:   1819.984 MB
memory used before:   1804.747 MB
2.91990804672
memory used after:   1794.081 MB
memory used before:   1809.826 MB
2.91166186333
memory used after:   1818.587 MB
memory used before:   1803.350 MB
2.95952391624
memory used after:   1797.001 MB
memory used before:   1811.984 MB
2.91142201424
memory used after:   1816.302 MB
memory used before:   1800.810 MB
2.9145720005
memory used after:   1799.668 MB
memory used before:   1814.651 MB
2.90542387962
memory used after:   1815.667 MB
memory used before:   1800.176 MB
2.91245412827
memory used after:   1797.890 MB
memory used before:   1813.381 MB
3.33899497986
memory used after:   1827.348 MB
memory used before:   1811.857 MB
3.01357889175
memory used after:   1813.254 MB
memory used before:   1828.491 MB
3.23349690437
memory used after:   1812.238 MB
memory used before:   1797.001 MB
2.90893101692
memory used after:   1812.873 MB
memory used before:   1828.110 MB
3.13155198097
memory used after:   1808.175 MB
memory used before:   1792.938 MB
3.19162797928
memory used after:   1818.968 MB
memory used before:   1834.205 MB
3.23461008072
memory used after:   1807.540 MB
memory used before:   1792.049 MB
2.99889612198
memory used after:   1792.938 MB
memory used before:   1808.175 MB
2.89187407494
memory used after:   1824.047 MB
memory used before:   1808.810 MB
2.90934300423
memory used after:   1822.650 MB
memory used before:   1837.634 MB
3.13104701042
memory used after:   1817.190 MB
memory used before:   1801.699 MB
2.90805602074
memory used after:   1792.430 MB
memory used before:   1807.159 MB
3.12630009651
memory used after:   1822.904 MB
memory used before:   1807.921 MB
3.09530520439
memory used after:   1792.430 MB
memory used before:   1807.159 MB
2.8856780529
memory used after:   1815.667 MB
memory used before:   1800.176 MB
2.9047768116
memory used after:   1792.430 MB
memory used before:   1807.159 MB
2.88658618927
memory used after:   1808.048 MB
memory used before:   1792.303 MB
2.9025478363
memory used after:   1813.000 MB
memory used before:   1827.983 MB
2.88618993759
memory used after:   1807.921 MB
memory used before:   1792.430 MB
3.00024604797
memory used after:   1802.080 MB
memory used before:   1817.317 MB
2.89264798164
memory used after:   1817.444 MB
memory used before:   1802.207 MB
2.91314888
memory used after:   1812.746 MB
memory used before:   1827.983 MB
2.89211297035
memory used after:   1815.540 MB
memory used before:   1800.303 MB
2.91199088097
memory used after:   1815.667 MB
memory used before:   1831.158 MB
2.8922328949
memory used after:   1810.969 MB
memory used before:   1795.731 MB
3.14539909363
memory used after:   1792.430 MB
memory used before:   1807.413 MB
3.35609006882
memory used after:   1811.034 MB
memory used before:   1795.797 MB
2.89836502075
memory used after:   1806.971 MB
memory used before:   1822.208 MB
2.9469370842
memory used after:   1819.288 MB
memory used before:   1804.050 MB
3.12520313263
memory used after:   1802.146 MB
memory used before:   1806.971 MB
2.898832798
memory used after:   1807.733 MB
memory used before:   1792.242 MB
2.91142916679
memory used after:   1813.066 MB
memory used before:   1827.795 MB
2.89269399643
memory used after:   1826.779 MB
memory used before:   1811.796 MB
2.90826797485
memory used after:   1792.242 MB
memory used before:   1806.971 MB
2.89969587326
memory used after:   1813.955 MB
memory used before:   1798.463 MB
2.90275502205
memory used after:   1801.130 MB
memory used before:   1816.113 MB
2.89589905739
memory used after:   1817.002 MB
memory used before:   1801.257 MB
2.90843391418
memory used after:   1800.876 MB
memory used before:   1815.605 MB
2.9082968235
memory used after:   1807.733 MB
memory used before:   1792.242 MB
2.90734601021
memory used after:   1798.472 MB
memory used before:   1813.709 MB
2.88730621338
memory used after:   1828.303 MB
memory used before:   1812.812 MB
2.90509009361
memory used after:   1794.400 MB
memory used before:   1809.129 MB
2.88682293892
memory used after:   1810.907 MB
memory used before:   1795.670 MB
2.90914511681
memory used after:   1811.669 MB
memory used before:   1826.906 MB
2.89076185226
memory used after:   1810.018 MB
memory used before:   1794.527 MB
2.90601706505
memory used after:   1794.400 MB
memory used before:   1809.129 MB
2.89525508881
memory used after:   1824.096 MB
memory used before:   1808.859 MB
2.90798592567
memory used after:   1822.302 MB
memory used before:   1837.285 MB
2.88688588142
memory used after:   1809.732 MB
memory used before:   1794.241 MB
2.90636587143
memory used after:   1807.573 MB
memory used before:   1822.810 MB
2.88751983643
memory used after:   1809.859 MB
memory used before:   1794.367 MB
2.91146397591
memory used after:   1802.367 MB
memory used before:   1817.604 MB
2.89106297493
memory used after:   1831.698 MB
memory used before:   1816.461 MB
2.90185213089
memory used after:   1794.494 MB
memory used before:   1809.224 MB
2.86784505844
memory used after:   1809.986 MB
memory used before:   1794.494 MB
2.89430880547
memory used after:   1812.271 MB
memory used before:   1827.508 MB
2.88921499252
memory used after:   1821.413 MB
memory used before:   1805.922 MB
2.90713381767
memory used after:   1794.241 MB
memory used before:   1808.970 MB
2.88738679886
memory used after:   1810.620 MB
memory used before:   1795.383 MB
2.90674495697
memory used after:   1794.367 MB
```