我已经实现了缓存遗忘算法,并且已经向PAPI library显示L1 / L2 / L3未命中率非常低。但是,如果我减少可用的RAM内存并强制算法开始使用磁盘中的交换空间,我还想看看算法的行为。由于算法是缓存不经意,因此对于同样的问题,与其他非缓存遗忘算法相比,我应该期待更好地扩展到磁盘。
但问题是,很难预测一旦磁盘出现这些算法会有多糟糕。输入大小的小幅增加可能会大大改变算法完成运行所需的时间。因此,如果你想要测试许多算法,如果需要永远完成,那么实验将毫无用处(我当然可以坐下来监视实验,如果使用ctrl+c
就可以杀死,但我真的需要睡觉)。
假设算法为A
,B
和C
。我使用不同的python脚本,每个算法一个。对于不同的输入大小n
,我使用subprocess.check_output
来调用实现的可执行文件。此可执行文件返回一些统计信息,然后我以合适的格式处理和存储,然后我可以使用R
来制作一些不错的图。
这是算法A的示例代码:
import subprocess
import sys
f1=open('data.stats', 'w+', 1)
min = 200000
max = 2000000
step = 200000
iterations = 10
ns = range(minLeafs, maxLeafs+1, step)
incr = 0
f1.write('n\tp\talg\ttime\n')
for n in ns:
i = 0
for p in ps:
for it in range(0, iterations):
resA = subprocess.check_output(['/usr/bin/time', '-v','./A',n],
stderr=subprocess.STDOUT)
#do something with resA
f1.write(resA + '\n')
incr = incr + 1
print(incr/(((len(ns)))*iterations)*100.0, '%', end="\r")
i = i + 1
我的问题是,如果subprocess.check_output
花费太长时间才能收到答案,我可以以某种方式杀死脚本吗?最好的事情是我定义一个截止,比如10分钟,所以如果subprocess.check_output
没有收到任何东西,那么杀死整个脚本。
答案 0 :(得分:1)
如果你正在使用Python 3(并且你的打印调用的格式可能是你的那个),那么check_output
实际上已经有一个可能对你有用的超时参数:https://docs.python.org/3.6/library/subprocess.html#subprocess.check_output < / p>