0

So basically I have a list of 300 values and different averages associated with each one.

I have a for-loop that generates a list of ten of these values at random, and writes it to excel if certain conditions are met based on their averages.

The code runs fine if I loop through 10 million times or less, but that is orders of magnitudes too small. Even if I just double the for loop counter to 20 million my computer becomes unusable while it is running.

I want to iterate the loop 100 million or 1 billion times even. I want it to run slowly in the background, I don't care if it takes 24 hours to get to the results. I just want to use my computer while it's working. Currently, if the for loop goes past 10 million the memory and disk usage of my laptop go to 99%.

Using pyScripter and python 3.3

Comp specs: Intel Core i7 4700HQ (2.40GHz) 8GB Memory 1TB HDD NVIDIA GeForce GTX 850M 2GB GDDR3

Code snippet:

for i in range( 0, cycles ):
    genRandLineups( Red );                     #random team gens
    genRandLineups( Blue );
    genRandLineups( Purple );
    genRandLineups( Green );

    if          sum( teamAve[i] )    <= 600
        and ( ( sum( teamValues[i] ) >  currentHighScore )
            or  sum( teamValues[i] ) >  1024 
            ):
        teamValuesF.append( teamValues[i] )


        sheetw.write( q, 0, str( teamValues[i] ) )
        ts = time.time()
        workbookw.save( "Data_Log.xls" )
        st = datetime.datetime.fromtimestamp( ts ).strftime( '%Y-%m-%d %H:%M:%S' )
        sheetw.write( q, 3, st )
        q = q + 1

        if sum( teamValues[i] ) > currentHighScore:
            currentHighScore = sum( teamValues[i] )
4

2 回答 2

3

首先,我怀疑你真正的问题是你只是保留了太多的内存,导致你的计算机运行虚拟机交换,这使得你的整个计算机变得缓慢。你真的应该考虑解决这个问题,而不是仅仅试图让它在一天中周期性地发生,而不是不断地发生。

特别是,听起来您永远保留了 10N 个值的列表。你真的需要这样做吗?

如果没有,请开始释放它们。(或者一开始就不要存储它们。很多人遇到的一个常见问题是他们需要 10 亿个值,但一次只需要一个值,一次通过一个循环,并且他们将它们存储在一个列表中他们可能正在使用迭代器。这基本上是熟悉readlines()问题的通用版本。)

如果是这样,请寻找一些有效的基于磁盘的存储而不是内存,或者更紧凑的东西,例如 NumPy 数组而不是列表。


但与此同时,如果你想降低程序的优先级,最简单的方法可能是外部。例如,在除 Windows 之外的大多数平台上,您只需启动您的脚本,nice 20 python myscript.py操作系统就会为其他所有平台提供比您的程序更多的 CPU 时间。


但是要回答您的直接问题,如果您想从内部减慢您的脚本速度,这很容易做到:sleep每隔一段时间调用一次。这要求操作系统暂停您的程序,并且在指定的秒数到期之前不给您任何资源。这可能只是近似的,而不是在 N 秒内绝对没有,但它已经足够接近(并且尽可能好)。

例如:

for i in range(reps):
    do_expensive_work():
    if i % 100 == 99:
        time.sleep(10)

如果do_expensive_work需要 18 毫秒,您将烧毁 CPU 1.8 秒,然后休眠 10 秒并重复。我怀疑这正是您想要的行为(或者需要 18 毫秒),但您可以调整数字。或者,如果时间是可变的,并且您希望睡眠百分比保持一致,您可以测量时间并从上次睡眠后每 N 秒睡眠一次,而不是每 N 次重复。

于 2014-11-07T20:14:40.370 回答
0

不要减速。而是为 HPC 重新设计和介入

对于仅“几个”项目( 300 个值的列表)的高性能处理,最好的将包括:

  1. 避免文件访问(即使如 OP 中所述是稀疏的)- 缓存 TruePOSITIVEs 在最后anOutputSTRINGfileIO-ed 或字符串长度限制或编组到另一台远程日志记录机器。

  2. 所有高度迭代的处理(据说是跨周期的10E+006)移动10E+009到您笔记本电脑中已有的 GPU 上的大规模并行 GPU/CUDA 内核处理上,以释放您的 CPU 资源并获得大约 1.15 的 640 线程的好处并行引擎计算能力的TFLOP,而不是来自 CPU 内核的少数 GUI 共享 MFLOP。

于 2014-11-07T20:32:54.053 回答