Обнаружение пропуска кэша, коэффициентов попаданий в файле трассировки ввода / вывода

У меня есть файл трассировки ввода / вывода со следующими полями ('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): будет вызывать с новым аргументом каждую итерацию, поэтому кэш никогда не будет работать.

Другие вопросы по тегам