forked from cacheMon/libCacheSim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfutureReuse.py
152 lines (122 loc) · 4.42 KB
/
futureReuse.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
"""
plot future_reuse time distribution
TO update
"""
import os, sys
import re
import logging
import numpy as np
import matplotlib.pyplot as plt
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../"))
from utils.trace_utils import extract_dataname
from utils.plot_utils import FIG_DIR, FIG_TYPE
from utils.data_utils import conv_to_cdf
logger = logging.getLogger("future_reuse")
def _load_future_reuse_data(datapath):
"""load future_reuse distribution plot data from C++ computation"""
ifile = open(datapath)
data_line = ifile.readline()
desc_line = ifile.readline()
m = re.match(r"# read reuse real time: req_cnt", desc_line)
desc_line_true = "# real time: reuse_cnt, stop_reuse_cnt, reuse_access_age_sum, stop_reuse_access_age_sum, reuse_freq_sum, stop_reuse_freq_sum"
assert desc_line_true in desc_line, (
"the input file might not be future_reuse data file, desc line "
+ desc_line
+ " data "
+ datapath
)
reuse_cnt_dict, stop_reuse_cnt_dict = {}, {}
reuse_access_age_sum_dict, stop_reuse_access_age_sum_dict = {}, {}
reuse_freq_sum_dict, stop_reuse_freq_sum_dict = {}, {}
last_reuse_time = 0
for line in ifile:
reuse_time, data_str = line.strip("\n").split(":")
reuse_time = int(reuse_time)
if reuse_time < last_reuse_time:
# print(f"skip {line}")
continue
last_reuse_time = reuse_time
(
reuse_cnt,
stop_reuse_cnt,
reuse_access_age_sum,
stop_reuse_access_age_sum,
reuse_freq_sum,
stop_reuse_freq_sum,
) = [int(i) for i in data_str.split(",")]
reuse_cnt_dict[reuse_time] = reuse_cnt
stop_reuse_cnt_dict[reuse_time] = stop_reuse_cnt
reuse_access_age_sum_dict[reuse_time] = reuse_access_age_sum
stop_reuse_access_age_sum_dict[reuse_time] = stop_reuse_access_age_sum
reuse_freq_sum_dict[reuse_time] = reuse_freq_sum
stop_reuse_freq_sum_dict[reuse_time] = stop_reuse_freq_sum
if reuse_cnt == 0:
assert reuse_access_age_sum == 0
ifile.close()
return (
reuse_cnt_dict,
stop_reuse_cnt_dict,
reuse_access_age_sum_dict,
stop_reuse_access_age_sum_dict,
reuse_freq_sum_dict,
stop_reuse_freq_sum_dict,
)
def plot_future_reuse(datapath_list, figname_prefix=""):
"""
plot future_reuse
"""
if len(figname_prefix) == 0:
figname_prefix = datapath_list[0].split("/")[-1]
for datapath in datapath_list:
(
reuse_cnt_dict,
stop_reuse_cnt_dict,
reuse_access_age_sum_dict,
stop_reuse_access_age_sum_dict,
reuse_freq_sum_dict,
stop_reuse_freq_sum_dict,
) = _load_future_reuse_data(datapath)
x = sorted(stop_reuse_cnt_dict.keys())
y = np.cumsum(np.array([stop_reuse_cnt_dict[k] for k in x]))
y = 1 - y / y[-1]
plt.plot([i / 3600 for i in x], y, label=datapath.split("/")[-1])
plt.legend(fontsize=16)
plt.grid(linestyle="--")
plt.ylabel("Fraction of requests (CDF)")
plt.xlabel("Age (hour)")
plt.savefig(
"{}/{}_noReuse_rt.{}".format(FIG_DIR, figname_prefix, FIG_TYPE),
bbox_inches="tight",
)
plt.xscale("log")
plt.xticks(
np.array([5, 60, 300, 3600, 86400, 86400 * 2, 86400 * 4]) / 3600,
["5 sec", "1 min", "5 min", "1 hour", "1 day", "", "4 day"],
rotation=28,
)
plt.savefig(
"{}/{}_noReuse_rt_log.{}".format(FIG_DIR, figname_prefix, FIG_TYPE),
bbox_inches="tight",
)
plt.clf()
if __name__ == "__main__":
import argparse, glob
ap = argparse.ArgumentParser()
ap.add_argument("datapath", type=str, default="", help="data path")
ap.add_argument("datapath-prefix", type=str, default="", help="data path")
ap.add_argument(
"--figname-prefix", type=str, default="", help="the prefix of figname"
)
p = ap.parse_args()
# try:
datapath_list = []
if p.datapath:
datapath_list.append(p.datapath)
elif p.datapath_prefix:
datapath_list = glob.glob(p.datapath_prefix + ".*.createFutureReuse")
else:
raise RuntimeError("provide data_path/datapath_prefix")
print(datapath_list)
plot_future_reuse(datapath_list, p.figname_prefix)
# except Exception as e:
# print("{} data {}".format(e, p.datapath))