Commit c8178be7 authored by Paul Graydon's avatar Paul Graydon

wendelin_telecom_base: Fix KPI graphing memory usage and delay

Use ZBigArray viewing as ndarray instead of copying
parent 82ed0709
Pipeline #40107 passed with stage
in 0 seconds
......@@ -17,21 +17,21 @@ NA_VALUES_REPLACEMENTS = {
'ul_hi': 0.
}
def resample_data_array(
np_data_array, time_field,
def resample_data_zarray(
np_data_zarray, time_field,
time_start, time_end, resample_size
):
'''
Resample the provided numpy data array to the provided new size
by averaging values in regular time intervals, if it is long enough to be downsized.
by averaging values in regular time intervals, if it is large enough to be downsized.
Return a dictionary with the data arrays keyed to their respective data fields.
'''
data_frame = pd.DataFrame.from_records(np_data_array)
data_frame = pd.DataFrame.from_records(np_data_zarray)
data_frame[time_field] = pd.to_datetime(data_frame[time_field], unit='s')
data_frame = data_frame.sort_values(by=time_field)
# Resample data
if len(np_data_array) > resample_size:
# Resample data if array is too large
if len(np_data_zarray) > resample_size:
resample_period = '%ss' % int((time_end - time_start) / resample_size)
data_frame = data_frame.resample(resample_period, on=time_field).mean()
data_frame = data_frame.fillna(value=NA_VALUES_REPLACEMENTS)
......@@ -56,36 +56,40 @@ def getOrsEnbKpi(
try:
data_array = portal.restrictedTraverse(data_array_url)
data_array = np.array(data_array.getArray())
except KeyError:
# Data Array does not exist
RESPONSE.setStatus(404)
return
# Data Array is empty
if data_array.shape in [(), (0,)]:
data_array_shape = data_array.getArrayShape()
data_array_dtype = data_array.getArrayDtypeNames()
if data_array_shape is None \
or data_array_dtype is None \
or data_array_shape in [(), (0,)]:
RESPONSE.write(json.dumps(dict()))
return
RESPONSE.setHeader("Content-Type", "application/json")
time_field = data_array.dtype.names[0]
data_zarray = data_array.getArray()[:]
time_field = data_array_dtype[0]
if time_start is None or time_start == 'NaN':
time_start = data_array[time_field][0]
time_start = data_zarray[time_field][0]
else:
time_start = float(time_start)
if time_end is None or time_end == 'NaN':
time_end = data_array[time_field][-1]
time_end = data_zarray[time_field][-1]
else:
time_end = float(time_end)
time_mask = (data_array[time_field] >= time_start) \
& (data_array[time_field] <= time_end)
time_mask = (data_zarray[time_field] >= time_start) \
& (data_zarray[time_field] <= time_end)
if isinstance(time_mask, np.ndarray):
data_array = data_array[time_mask]
data_zarray = data_zarray[time_mask]
if kpi_type == 'e_rab_accessibility':
resampled_data_dict = resample_data_array(
data_array,
resampled_data_dict = resample_data_zarray(
data_zarray,
time_field,
time_start,
time_end,
......@@ -109,16 +113,16 @@ def getOrsEnbKpi(
ul_hi = []
for qci in range(QCI_COUNT):
qci_data_array = data_array[qci::QCI_COUNT]
qci_dl_hi = qci_data_array['dl_hi']
qci_ul_hi = qci_data_array['ul_hi']
qci_data_zarray = data_zarray[qci::QCI_COUNT]
qci_dl_hi = qci_data_zarray['dl_hi']
qci_ul_hi = qci_data_zarray['ul_hi']
# QCI is silent: skip it
if (qci_dl_hi == 0.).all() and (qci_ul_hi == 0.).all():
continue
resampled_qci_data_dict = resample_data_array(
qci_data_array,
resampled_qci_data_dict = resample_data_zarray(
qci_data_zarray,
time_field,
time_start,
time_end,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment