Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- import numpy as np
- import sys
- def main():
- t0 = time.time()
- vlans, requests = load_files()
- total = len(requests)
- no_redundancy = len(requests[requests[:,1] == 0])
- with_redundancy = total - no_redundancy
- output_rows = no_redundancy + with_redundancy * 2
- out = [np.zeros(output_rows, dtype=int) for i in range(4)]
- by_vlan_id = np.sort(vlans.view('int, int, int'), kind='mergesort', order=['f2', 'f0'], axis=0)
- no_red_start = 0
- with_red_start = 0
- idx = 0
- t1 = time.time()
- for req in requests:
- if req[1]:
- dev_id, vlan_id, with_red_start = next_with_redundancy(by_vlan_id, with_red_start)
- out[0][idx:idx+2] = req[0]
- out[1][idx:idx+2] = dev_id
- out[3][idx:idx+2] = vlan_id
- out[2][idx] = 0
- out[2][idx+1] = 1
- idx += 2
- else:
- dev_id, vlan_id, no_red_start = next_no_redundancy(by_vlan_id, no_red_start)
- out[0][idx] = req[0]
- out[1][idx] = dev_id
- out[2][idx] = 1
- out[3][idx] = vlan_id
- idx += 1
- t2 = time.time()
- np.savetxt('output_np2.csv', np.array(out).transpose(), fmt="%d", delimiter=",", newline="\n", header='request_id,device_id,primary_port,vlan_id', comments="")
- t3 = time.time()
- print("%.2fsec: reading: %dms, processing: %dms, writing: %dms" % (
- t3 - t0, (t1 - t0) * 1000, (t2 - t1) * 1000, (t3 - t2) * 1000))
- def next_no_redundancy(vlan_info, start):
- for idx, info in enumerate(vlan_info[start:]):
- info = info[0]
- if not info[2]:
- continue
- if info[1]:
- dev_id = info[0]
- vlan_id = info[2]
- vlan_info[start + idx] = b'\x00'
- return dev_id, vlan_id, start + idx + 1
- raise ValueError("No free devices for a no-redundancy request! Need more moneyz!")
- def next_with_redundancy(vlan_info, start):
- dev_id, vlan_id, primary, secondary = None, None, None, None
- for idx, info in enumerate(vlan_info[start:]):
- info = info[0]
- if not info[2]:
- continue
- if dev_id is None or info[0] != dev_id or not vlan_id or info[2] != vlan_id:
- dev_id = info[0]
- vlan_id = info[2]
- primary, secondary = None, None
- if info[1]:
- primary = start + idx
- else:
- secondary = start + idx
- if primary is not None and secondary is not None:
- vlan_info[primary] = b'\x00'
- vlan_info[secondary] = b'\x00'
- return dev_id, vlan_id, start + idx + 1
- raise ValueError("No free devices for a request with redundancy! Need funding!")
- def load_files():
- vlans = np.loadtxt(open('vlans.csv', 'rb'), delimiter=",", skiprows=1, dtype=int)
- requests = np.loadtxt(open('requests.csv', 'rb'), delimiter=",", skiprows=1, dtype=int)
- return vlans, requests
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement