Python одновременное будущее сокращает использование памяти - PullRequest
0 голосов
/ 27 апреля 2020

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

from concurrent.futures import ProcessPoolExecutor

def compute(df1, df2):
  # computationally heavy function

def load_data1(fileName):
  # load data into pandas df

def load_data2(fileName):
  # load data into pandas df

def formSlices(df1, df2, df1Slices, df2Slices):
  # Based on columns of df1 and df2 form matched slices and put them in lists

df1 = load_data1(fileName1)
df2 = load_data2(fileName2)

df1Slices = []
df2Slices = []
formSlices(df1, df2, df1Slices, df2Slices)
del df1
del df2

# Process these chunks in parallel
with ProcessPoolExecutor() as executor:
  for x in executor.map(compute, df1Slices, df2Slices):
    print('Result: ' + x)

Код работает нормально, но он неэффективен, и я хочу улучшить его в двух местах:

  1. Есть ли лучший способ формирования кусков этих фреймов данных? У них есть общий ключ, и я использую его для формирования кусков. Я знаю, как перебирать группы одного фрейма данных, но как это сделать, когда есть два разных фрейма данных?
  2. Когда я запускаю эту программу и использую команду top, чтобы проверить состояние процессов python кажется, что все они используют одинаковый объем памяти, то есть кажется, что подпроцессы получают все из основного процесса. Это правда? Как мне убедиться, что каждый подпроцесс получает только один кусок? Это очень большой набор данных, и процессы перестают работать из-за проблем с памятью, если слишком много рабочих.
...