Обнаружение пропуска кэша, коэффициентов попаданий в файле трассировки ввода / вывода
У меня есть файл трассировки ввода / вывода со следующими полями ('asu', 'block_address','size', 'opcode','time_stamp'). Данные выглядят так. (более 5 миллионов строк)
0,20941264,8192,W,0.551706
0,20939840,8192,W,0.554041
0,20939808,8192,W,0.556202
1,3436288,15872,W,1.250720
1,3435888,512,W,1.609859
1,3435889,512,W,1.634761
0,7695360,4096,R,2.346628
1,10274472,4096,R,2.436645
2,30862016,4096,W,2 448003
2,30845544,4096,W,2.449733
1,10356592,4096,W,2.449733
Я пытаюсь добавить слой кэша в свой проект и хочу рассчитать промахи и попадания. я использую @functools.lru_cache(maxsize = None)
найти попадания в кеш и промахи для block_address. После урока я попытался вычислить промахи / хиты. blk_trace
массив трассировки для block_address.
@functools.lru_cache(maxsize = None)
def blk_iter():
blk_len = len(blk_trace)
for i in range(0,blk_len):
print(blk_trace[i])
При просмотре информации кеша blk_iter.cache_info()
, Я получил CacheInfo(hits=0, misses=1, maxsize=None, currsize=1)
, Что не правильно. Я довольно плохо знаком с понятиями Python и кэширования. Я не знаю, что я делаю не так. Как мне найти пропущенные / найденные адреса блока?
1 ответ
Кеш для функции blk_iter
- ты только звонил blk_iter
один раз, поэтому ваш размер кеша один, и он имеет один промах.
Рассмотрим следующую функцию с lru_cache
@lru_cache(maxsize=None)
def myfunc(x):
print('Cache miss: ', x)
return x + 1
Когда вызывается с определенным значением для x
функция запустится и результат будет сохранен в кеше. При повторном вызове с тем же параметром функция не будет работать вообще, и будет возвращено кэшированное значение.
>>> for i in range(3):
... print(myfunc(i))
...
Cache miss: 0
1
Cache miss: 1
2
Cache miss: 2
3
>>> myfunc(0) # this will be a cache hit
1
>>> myfunc(3) # this will be another miss
Cache miss: 3
4
>>> myfunc.cache_info()
CacheInfo(hits=1, misses=4, maxsize=None, currsize=4)
В вашем примере, даже если бы кэш был настроен правильно, у вас все равно было бы промахов и ни одного попадания for i in range(0,blk_len):
будет вызывать с новым аргументом каждую итерацию, поэтому кэш никогда не будет работать.