Как намеренно замедлить работу скрипта на python, чтобы он мог работать вечно в фоновом режиме, пока я работаю?

В общем, у меня есть список из 300 значений и различных средних значений, связанных с каждым.

у меня есть for -loop, который генерирует список из десяти этих значений случайным образом и записывает его, чтобы преуспеть, если определенные условия выполняются на основе их средних.

Код работает нормально, если я перебираю 10 миллионов раз или меньше, но это на несколько порядков меньше. Даже если я просто удвою счетчик цикла for до 20 миллионов, мой компьютер станет непригодным для использования во время работы.

Я хочу повторить цикл 100 миллионов или даже 1 миллиард раз. Я хочу, чтобы он работал медленно в фоновом режиме, мне все равно, если потребуется 24 часа, чтобы добраться до результатов. Я просто хочу использовать свой компьютер, пока он работает. В настоящее время, если цикл for превышает 10 миллионов, использование памяти и дисков моего ноутбука увеличивается до 99%.

С помощью pyScripter и питон 3.3

Технические характеристики: Intel Core i7 4700HQ (2,40 ГГц), 8 ГБ памяти, 1 ТБ жесткого диска, NVIDIA GeForce GTX, 850 МБ, 2 ГБ, 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] )

2 ответа

Решение

Во-первых, я подозреваю, что ваша настоящая проблема заключается в том, что вы просто сохраняете слишком много памяти, что приводит к тому, что ваш компьютер запускается подкачки виртуальных машин, что замедляет ваш компьютер. Вы должны действительно попытаться исправить это, вместо того, чтобы пытаться делать это периодически в течение дня, а не постоянно.

В частности, звучит так, будто вы держите список значений 10N навсегда. Вам действительно нужно это сделать?

Если нет, начните освобождать их. (Или не храните их в первую очередь. Одна из распространенных проблем, с которой сталкиваются многие люди, заключается в том, что им нужно 1 миллиард значений, но только по одному за раз, через цикл, и они сохраняют их в списке, когда они могли бы использовать итератор. Это в основном общая версия знакомой readlines() проблема.)

Если так, посмотрите на какое-нибудь эффективное дисковое хранилище вместо памяти или что-то более компактное, например, массив NumPy вместо списка.


Но в то же время, если вы хотите уменьшить приоритет программы, самый простой способ сделать это может быть внешне. Например, на большинстве платформ, кроме Windows, вы можете просто запустить свой скрипт с nice 20 python myscript.py и ОС даст всему остальному больше процессорного времени, чем ваша программа.


Но чтобы ответить на ваш прямой вопрос, если вы хотите замедлить работу скрипта изнутри, это довольно легко сделать: просто позвоните sleep очень часто Это заставляет ОС приостанавливать работу вашей программы и не давать вам никаких ресурсов, пока не истечет указанное количество секунд. Это может быть только приблизительным, а не абсолютно ничем в течение ровно N секунд, но это достаточно близко (и настолько хорошо, насколько вы можете сделать).

Например:

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

Если do_expensive_work занимает 18 мс, вы будете сжигать процессор в течение 1,8 секунд, затем спать в течение 10 и повторить. Я сомневаюсь, что это именно то поведение, которое вы хотите (или что это занимает 18 мс), но вы можете настроить цифры. Или, если время является переменным, и вы хотите, чтобы процент сна был постоянным, вы можете измерять время и спать каждые N секунд с момента последнего сна, а не каждые N повторений.

Не замедляйся. Скорее перепроектировать и вступить в HPC

Для высокопроизводительной обработки всего лишь "нескольких" элементов (список из 300 значений) лучшее будет состоять из:

  1. избегать доступа к файлам (даже если они редкие, как указано в OP) - кэшируйте TruePOSITIVEs в anOutputSTRING это существо fileIO- в конце или после ограничения длины струны или направляется на другую, удаленную, каротажную машину.

  2. переместить всю высоко итеративную обработку, скажем, в span 10E+006 - 10E+009 циклы, на массивно-параллельную обработку ядра GPU/CUDA на GPU, которая у вас уже есть в ноутбуке, как для освобождения ресурсов вашего процессора, так и для получения преимуществ от 640 потоков, обеспечивающих около 1,15 TFLOP вычислительной мощности параллельного двигателя, в отличие от всего лишь несколько MFLOP с общим графическим интерфейсом от ядер ЦП.

Другие вопросы по тегам