Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- from time import time
- # main logic function
- def main(result_file = 'test_output.csv', vlan_file = 'vlans.csv', requests_file = 'requests.csv'):
- # get files: with vlans data and requests data
- vlan_csv, requests_csv = read_data(vlan_file, requests_file)
- sorted_by_vlan_id = np.sort(vlan_csv.view('int, int, int'), kind='mergesort', order=['f2', 'f0'], axis=0)
- # maximum number of elements
- output_rows = len(requests_csv[requests_csv.transpose()[1] == 0]) + len(requests_csv[requests_csv.transpose()[1] == 1]) * 2
- # create zero-dataframe
- out_data = [np.zeros(output_rows, dtype=int) for i in range(4)]
- # index for slice
- no_redundancy_start = 0
- with_redundancy_start = 0
- idx = 0
- for request_data in requests_csv:
- # processing of non redundant requests
- if not request_data[1]:
- for index, element in enumerate(sorted_by_vlan_id[no_redundancy_start:]):
- element = element[0]
- if not element[2]:
- continue
- elif element[1]:
- # adding data in array
- out_data[0][idx] = request_data[0]
- out_data[1][idx] = element[0]
- out_data[2][idx] = 1
- out_data[3][idx] = element[2]
- # drop data
- sorted_by_vlan_id[index + no_redundancy_start] = b'\x00'
- no_redundancy_start = index + no_redundancy_start + 1
- break
- # processing of redundant requests
- elif request_data[1]:
- # params where we save data about pair elements
- device_id, vlan_id, primary, secondary = None, None, None, None
- for index, element in enumerate(sorted_by_vlan_id[with_redundancy_start:]):
- element = element[0]
- if not element[2]:
- continue
- if not device_id or element[0] != device_id or not vlan_id or element[2]!= vlan_id:
- # update params
- device_id = element[0]
- vlan_id = element[2]
- if element[1]:
- primary = index + with_redundancy_start
- else:
- secondary = index + with_redundancy_start
- if primary is not None and secondary is not None:
- # drop data
- sorted_by_vlan_id[primary] = b'\x00'
- sorted_by_vlan_id[secondary] = b'\x00'
- # adding data in array
- out_data[0][idx:idx + 2] = request_data[0]
- out_data[1][idx:idx + 2] = device_id
- out_data[3][idx:idx + 2] = vlan_id
- out_data[2][idx] = 0
- out_data[2][idx + 1] = 1
- with_redundancy_start = index + with_redundancy_start + 1
- break
- idx += 1
- idx += 1
- np.savetxt(result_file, np.array(out_data).transpose(), fmt="%d", delimiter=",", newline="\n",
- header='request_id,device_id,primary_port,vlan_id', comments="")
- # reading data from files and cleaning it
- def read_data(vlan_file, requests_file):
- vlans = np.loadtxt(open(vlan_file, 'rb'), delimiter=",", skiprows=1, dtype=int)
- requests = np.loadtxt(open(requests_file, 'rb'), delimiter=",", skiprows=1, dtype=int)
- return vlans, requests
- if __name__ == '__main__':
- for i in range(10):
- tic = time()
- main()
- tac = time()
- print(tac-tic)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement