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

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

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

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

  • Многопроцессорный пул с итератором
  • Что такое метод работы .join () для процесса многопроцессорности Python?
  • Запуск нескольких асинхронных функций и получение возвращаемого значения каждой функции
  • Проблема развертывания программы Python (в комплекте с py2exe)
  • Использование памяти многопроцессорной обработки Python
  • Совместное использование очереди результатов между несколькими процессами
  • Обратите внимание, что в памяти слишком много данных.

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

  • многопроцессорность в python - совместное использование большого объекта (например, dataframe pandas) между несколькими процессами
  • python - Чтение файла из и в определенные строки текста
  • Многопроцессорный пул Python pool.map для нескольких аргументов
  • Python opencv и многопроцессорность
  • Многопроцессорность Python.Код взаимоблокировки на put и get
  • Многопроцессорность с помощью numpy делает Python неожиданно завершающим в OSX
  • 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) 
    Python - лучший язык программирования в мире.