0

基本的に、300 個の値とそれぞれに関連付けられた異なる平均のリストがあります。

これらの値の 10 個のリストをforランダムに生成し、それらの平均に基づいて特定の条件が満たされている場合にそれを書き出す - ループがあります。

ループ回数が 1000 万回以下であればコードは正常に実行されますが、それは桁違いに小さすぎます。for ループ カウンターを 2 倍の 2000 万にしただけでも、実行中のコンピューターは使用できなくなります。

ループを1億回または10億回繰り返したい。バックグラウンドでゆっくり実行したいのですが、結果が出るまでに 24 時間かかってもかまいません。作業中にコンピュータを使用したいだけです。現在、for ループが 1,000 万を超えると、ラップトップのメモリとディスクの使用率は 99% になります。

pyScripterおよび python 3.3 の使用

Comp スペック: Intel Core i7 4700HQ (2.40GHz) 8GB メモリ 1TB HDD NVIDIA GeForce GTX 850M 2GB GDDR3

コードスニペット:

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

まず、あなたの本当の問題は、保持しているメモリが多すぎて、コンピューターが VM スワップを実行し、コンピューター全体のクロールが遅くなっていることだと思います。常にではなく、1日を通して定期的に発生させようとするのではなく、それを修正することを真剣に検討する必要があります.

特に、10N 値のリストを永遠に保持しているように思えます。あなたは本当にそれをする必要がありますか?

そうでない場合は、解放を開始します。(または、そもそもそれらを保存しないでください。多くの人が抱えている一般的な問題の 1 つは、10 億個の値が必要であるにもかかわらず、一度に 1 つずつ、ループを介して 1 回だけ、それらをリストに保存しているということです。これは基本的に、おなじみのreadlines()問題の一般的なバージョンです。)

もしそうなら、メモリの代わりに効率的なディスクベースのストレージ、またはリストの代わりに NumPy 配列のようなよりコンパクトなものを調べてください。


しかし一方で、プログラムの優先度を下げたい場合、最も簡単な方法は外部から行うことです。たとえば、Windows 以外のほとんどのプラットフォームでは、スクリプトを起動するだけnice 20 python myscript.pyで、OS は他のすべてのものにプログラムよりも多くの CPU 時間を与えます。


しかし、あなたの直接の質問に答えるために、スクリプトを内部から遅くしたい場合、それは非常に簡単です。時々呼び出すだけsleepです。これは、指定された秒数が経過するまでプログラムを一時停止し、リソースを提供しないように OS に要求します。これは、正確に N 秒間まったく何もないというよりは、おおよその値に過ぎないかもしれませんが、十分に近い (そしてできる限り良い) ものです。

例えば:

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

18 ミリ秒かかる場合do_expensive_work、1.8 秒間 CPU を消費し、10 秒間スリープして繰り返します。それがまさにあなたが望む動作(または18ミリ秒かかる)であるとは思えませんが、数値を微調整することはできます. または、タイミングが可変で、睡眠のパーセンテージを一定にしたい場合は、N回ごとではなく、最後の睡眠からN秒ごとに時間を測定して睡眠することができます.

于 2014-11-07T20:14:40.370 に答える
0

減速しないでください。むしろ、再設計して HPC に介入する

「少数」のアイテム ( 300 個の値のリスト) の高性能処理の場合、最適なものは次のようになります。

  1. ファイルアクセスを避けます ( OP に記載されているようにスパースであっても) -最後または文字列の長さの制限で処理されるか、別のリモートのログマシンにマーシャリングされるanOutputSTRINGTruePOSITIVEをキャッシュします。fileIO

  2. CPU リソースを解放し、約 1.15 を提供する 640 スレッドの利点を得るために、ラップトップに既にある GPU 上の超並列 GPU/CUDA カーネル処理にスパン10E+006--サイクルと言われるすべての高度に反復的な処理を移動します。 CPU コアからの数個の GUI 共有 MFLOP とは対照的に、並列エンジンのコンピューティング馬力の TFLOP 10E+009

于 2014-11-07T20:32:54.053 に答える