我有一个包含以下字段的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和缓存概念的新手。我不知道我做错了什么。
如何找到块地址的未命中/命中?
答案 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):
都会在每次迭代时使用新参数调用,因此缓存永远不会命中。