Python Flask app connected to Cassandra Astra DB RAM memory issue
05:18 18 Sep 2025

I'm running a minimal Python Flask app with one API endpoint which make a simple call to retrieve data from the a Cassandra Datastax DB inside a for loop.

# Day-2-Day Power
@app.route("/d2d_new_2/power")
def d2d_power():
    data = request.args
    result = get_data_op_power_d2d(data)
    return JsonResponse(response=result, status=HTTP_200_OK)

The problem is the memory keeps increasing if I trigger this request and does not decrease after the results were returned from the function.

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
   104 134.4766 MiB 134.4766 MiB           1   @profile(stream=log_file)
   105                                         def get_data_op_power_d2d(data: dict) -> pd.DataFrame:
   106 134.4766 MiB   0.0000 MiB          14       my_list = [string.strip() for string in data.get("books").split(",")]
   107 134.4766 MiB   0.0000 MiB           1       if data.get("as_of_op_old") == 'null' or data.get("as_of_op_new") == 'null':
   108                                                 abort(abort(HTTP_404_NOT_FOUND,
   109                                                             f'No data previous for as_of_op_old = {data.get("as_of_op_old")} '))
   110                                         
   111 134.4766 MiB   0.0000 MiB           1       as_of_op_old = parser.parse(data.get("as_of_op_old"))
   112 134.4766 MiB   0.0000 MiB           1       as_of_op_old = as_of_op_old.strftime('%Y-%m-%d')
   113 134.4766 MiB   0.0000 MiB           1       as_of_op_new = parser.parse(data.get("as_of_op_new"))
   114 134.4766 MiB   0.0000 MiB           1       as_of_op_new = as_of_op_new.strftime('%Y-%m-%d')
   115 134.4766 MiB   0.0000 MiB           1       ts_start = parser.parse(data.get("ts_start"))
   116 134.4766 MiB   0.0000 MiB           1       ts_end = parser.parse(data.get("ts_end"))
   117                                         
   118 143.6016 MiB   0.0000 MiB          12       for book_name in my_list:
   119 143.6016 MiB   6.7500 MiB          22           op_df_old = pd.DataFrame(get_op_power_data(
   120 143.6016 MiB   0.0000 MiB          11               as_of=as_of_op_old, book_op=book_name, ts_start=ts_start, ts_end=ts_end
   121                                                 ))
   122                                         
   123 143.6016 MiB   2.3750 MiB          22           op_df_new = pd.DataFrame(get_op_power_data(
   124 143.6016 MiB   0.0000 MiB          11               as_of=as_of_op_new, book_op=book_name, ts_start=ts_start, ts_end=ts_end
   125                                                 ))
   126                                         
   127 143.6016 MiB   0.0000 MiB          11           del op_df_old
   128 143.6016 MiB   0.0000 MiB          11           del op_df_new        
   129 143.6016 MiB   0.0000 MiB          11           gc.collect()
   130                                         
   131 143.6016 MiB   0.0000 MiB           1       return pd.DataFrame()

This is the db call:

def get_op_power_data(as_of, book_op, ts_start, ts_end):
    try:
        execution = session.execute("SELECT time, value, is_peak FROM series_op_power WHERE as_of=%s AND name = %s AND time >= %s AND time < %s", 
        (as_of, book_op, ts_start, ts_end))
        return list(execution)
    except Exception as e:
        return []

I have the same example with a for loop where I store something in some local variables and delete them afterwards and the memory decreases afterwards (at least for one variable we can see it).

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
   120 109.5000 MiB 109.5000 MiB           1   @profile(stream=log_file)
   121                                         def get_data_op_power_d2d(data: dict):
   122 109.5000 MiB   0.0000 MiB          14       my_list = [string.strip() for string in data.get("books").split(",")]
   123 109.5000 MiB   0.0000 MiB           1       if data.get("as_of_op_old") == 'null' or data.get("as_of_op_new") == 'null':
   124                                                 abort(HTTP_404_NOT_FOUND, f'No data previous for as_of_op_old = {data.get("as_of_op_old")} ')
   125                                         
   134 109.5000 MiB   0.0000 MiB           1       results_list = []
   135                                         
   136 125.0117 MiB  -0.4062 MiB          12       for book_name in my_list:
   
   148 117.4180 MiB   7.2188 MiB          11            a = [1] * (10 ** 6)
   149 269.9414 MiB 1677.5938 MiB         11            b = [2] * (2 * 10 ** 7)
   150 117.4180 MiB -1678.0820 MiB        11            del b
   151 125.0117 MiB   7.1875 MiB          11            del a
   152                                             
   153 125.0117 MiB   0.0000 MiB           1       log_file.flush()
   154                                         
   155 125.0117 MiB   0.0000 MiB           1       del my_list
   156 125.0117 MiB   0.0000 MiB           1       gc.collect()
   157 125.0117 MiB   0.0000 MiB           1       return results_list

I have multiple operations inside the initial function and there is a memory leak in Grafana when I monitor the app so I tried to reduce it even further by removing the database connection and just reading the data from csv files but I still see the RAM memory keeps going up and doesn't decrease back to a previous state.

enter image description here

Logs to show the memory increase :

System Memory: 64.0% used (9.16 GB / 15.44 GB)
App Process: 0.7% used (109.11 MB RSS, 836.41 MB VMS)

[2025-09-18 11:10:34] Iteration 29878
----------------------------------------
System Memory: 64.3% used (9.20 GB / 15.44 GB)
App Process: 0.8% used (122.17 MB RSS, 915.45 MB VMS)

[2025-09-18 11:10:39] Iteration 29879
----------------------------------------
System Memory: 64.1% used (9.17 GB / 15.44 GB)
App Process: 0.8% used (122.17 MB RSS, 915.45 MB VMS)

And the logs to show the endpoint call:

127.0.0.1 - - [18/Sep/2025 11:10:32] "GET /d2d_new_2/power?books=DE_STC&as_of_op_old=2025-08-06&as_of_op_new=2025-08-15&ts_start=2025-01-01T00:00:00.000%2B01:00&ts_end=2026-01-01T00:00:00.000%2B01:00&aggr=quarter HTTP/1.1" 200 -
127.0.0.1 - - [18/Sep/2025 11:10:34] "GET /info/memory HTTP/1.1" 200 -
127.0.0.1 - - [18/Sep/2025 11:10:39] "GET /info/memory HTTP/1.1" 200 -
127.0.0.1 - - [18/Sep/2025 11:10:44] "GET /info/memory HTTP/1.1" 200 -
python flask cassandra memory-leaks datastax-astra