在I / O跟踪文件中查找缓存未命中,命中率

时间:2018-03-23 20:25:54

标签: python caching io lru functools

我有一个包含以下字段的I / O跟踪文件('asu','block_address','size','opcode','time_stamp')。 数据看起来像这样。 (超过500万行)

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的缓存命中和未命中。 在tutorial之后,我尝试计算未命中/命中。 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 个答案:

答案 0 :(得分:0)

缓存用于函数blk_iter - 您只调用blk_iter一次,因此您的缓存大小为1,并且只有一个未命中。

使用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):都会在每次迭代时使用新参数调用,因此缓存永远不会命中。