Запись данных на диск в Python в качестве фонового процесса

У меня есть программа на Python, которая в основном делает следующее:

for j in xrange(200): # 1) Compute a bunch of data # 2) Write data to disk 

1) занимает около 2-5 минут
2) занимает около 1 минуты

Обратите внимание, что в памяти слишком много данных.

В идеале, что я хотел бы сделать, это записать данные на диск таким образом, чтобы избежать холостого хода процессора. Возможно ли это на Python? Благодаря!

  • py2exe ImportError: нет модуля с именем <package I immedmented>
  • Изменение других объектов при обновлении / вставке
  • Структура проекта для проектов python
  • достаточно безопасная 8-символьная короткая уникальная случайная строка
  • Разделите два списка в python
  • Настройка jython в Eclipse / PyCharm
  • Получение уровня уверенности в обнаружении Multiscale в OpenCV с помощью Python?
  • Кодер Python JSON для поддержки даты и времени?
  • 3 Solutions collect form web for “Запись данных на диск в Python в качестве фонового процесса”

    Вы можете попробовать несколько процессов :

     import multiprocessing as mp def compute(j): # compute a bunch of data return data def write(data): # write data to disk if __name__ == '__main__': pool = mp.Pool() for j in xrange(200): pool.apply_async(compute, args=(j, ), callback=write) pool.close() pool.join() 

    pool = mp.Pool() создаст пул рабочих процессов. По умолчанию количество рабочих равно числу ядер процессора, которые имеют ваш компьютер.

    Каждый вызов pool.apply_async ставит в очередь задачу, которую должен выполнять рабочий в пуле рабочих процессов. Когда рабочий доступен, он запускает compute(j) . Когда рабочий возвращает значение, data , поток в основном процессе запускает функцию функции обратного вызова write(data) , а data являются данными, возвращаемыми рабочим.

    Некоторые оговорки:

    • Данные должны быть выбраны, поскольку они передаются из рабочего процесса обратно в основной процесс через очередь .
    • Нет гарантии, что порядок, в котором рабочие выполняют задачи, совпадает с порядком, в котором задачи были отправлены в пул. Таким образом, порядок, в котором данные записываются на диск, может не соответствовать j от 0 до 199. Один из способов решения этой проблемы – записать данные в базу данных sqlite (или другого типа) с j как одно из полей данных. Затем, когда вы хотите прочитать данные по порядку, вы можете SELECT * FROM table ORDER BY j .
    • Использование нескольких процессов увеличит объем требуемой памяти, поскольку данные генерируются рабочими процессами, и данные, ожидающие записи на диск, накапливаются в очереди. Возможно, вы сможете уменьшить объем памяти, необходимый при использовании массивов NumPy. Если это невозможно, возможно, вам придется сократить количество процессов:

       pool = mp.Pool(processes=1) 

      Это создаст один рабочий процесс (для запуска compute ), оставив основной процесс для запуска write . Поскольку compute занимает больше времени, чем write , очередь не будет поддерживаться с более чем одним фрагментом данных, которые будут записаны на диск. Тем не менее, вам все равно потребуется достаточно памяти для вычисления на одном фрагменте данных при написании другого фрагмента данных на диск.

      Если у вас недостаточно памяти для одновременного использования одновременно, то у вас нет выбора – единственный исходный код, который запускает compute и write последовательно.

    Вы можете использовать что-то вроде Queue.Queue (модуль здесь: Queue ) и threading.Thread (или threading.start_new_thread если вы просто хотите функцию), здесь находится модуль: threading – поскольку запись в файл не требует интенсивного процессора и используйте более IO. (и GIL не влияет на него).

    Простым способом было бы использовать только потоки и очередь. С другой стороны, если вычислительная часть не зависит от глобального состояния, и у вас есть машина с несколькими ядрами ЦП, более эффективным способом будет использование пула процессов

     from multiprocessing import Pool def compute_data(x): return some_calculation_with(x) if __name__ == '__main__': pool = Pool(processes=4) # let's say you have quad-core, so start 4 workers with open("output_file","w") as outfile: for calculation_result in pool.imap(compute_data, range(200)): # pool.imap returns results as they come from process pool outfile.write(calculation_result) 
    Interesting Posts

    Microsoft Outlook Создать правило запускать приложение / скрипт Python

    Не удается заставить Elasticsearch работать с Django

    Numpy: Умножение матрицы с тензором 3d – Предложение

    pygame требует прерывания клавиатуры для отображения init

    Оценить экспоненциальное обрезание в распределении степенного закона

    Отправка файла через TCP-сокеты в Python

    Использовать Python вместе с C # в приложении Windows UWP

    Как определить рекурсивную функцию для объединения двух отсортированных списков и возврата нового списка с возрастающим порядком в Python?

    Макет родительского класса __init__ метод

    Как полностью удалить Python с Windows-машины?

    Является ли MATLAB быстрее, чем Python (небольшой простой эксперимент)

    Python: Загрузить возвращенный Zip-файл из URL-адреса

    sqlalchemy flask: AttributeError: объект «Session» не имеет атрибута «_model_changes» на session.commit ()

    Как установить максимальную длину для списка / набора python?

    Навигация вручную с помощью курсора через вложенные списки, только предоставляя «left ()» и «right ()» в качестве команд?

    Python - лучший язык программирования в мире.