Можно ли использовать Datalab с многопроцессорной обработкой для масштабирования преобразований Pandas?

Я пытаюсь использовать Google Cloud Datalab для масштабирования преобразования данных в Pandas.

На моей машине все нормально работает с небольшими файлами (сохраняя первые 100000 строк моего файла), но работа с полным входным CSV-файлом 8G приводила к ошибке памяти.

Я думал, что виртуальная машина Datalab поможет мне. Сначала я попытался использовать виртуальную машину с Highmem, доведя до 120 ГБ памяти. Там я продолжаю получать сообщение об ошибке: ядро ​​​​похоже, умерло. Он перезапустится автоматически. Я нашел кое-что здесь: https://serverfault.com/questions/900052/datalab-crashing-despite-high-memory-and-cpu Но я не использую TensorFlow, так что это мало помогло.

Поэтому я попробовал другой подход, обработку фрагментов и распараллеливание на большем количестве ядер. Он хорошо работает на моей машине (4 ядра, 12 Гб оперативной памяти), но требует многочасовых вычислений.

Поэтому я хотел использовать виртуальную машину Datalab с 32 ядрами для ускорения работы, но тут через 5 часов первые потоки так и не завершились, когда на моей локальной машине завершено уже 10.

Так очень просто:

Можно ли использовать Datalab как способ масштабирования преобразований Pandas? Почему я получаю худшие результаты с теоретически намного лучшей виртуальной машиной, чем моя локальная машина?

Некоторый код:

import pandas as pd
import numpy as np
from OOS_Case.create_features_v2 import process
from multiprocessing.dummy import Pool as ThreadPool 



df_pb = pd.read_csv('---.csv')
list_df = []
for i in range(-) :
    df = df_pb.loc[---]
    list_df.append(df)



pool = ThreadPool(4) 
pool.map(process, list_df)

Все операции в моей функции процесса - это чистые операции Pandas и Numpy.

Спасибо за любой совет, альтернативу или лучший практический совет, который вы могли бы мне дать!


person MichaelU    schedule 09.04.2019    source источник


Ответы (2)


Похоже, что GCP Datalab не поддерживает многопоточность:

Каждое ядро ​​является однопоточным. Если вы не используете несколько ноутбуков одновременно, несколько ядер могут не дать существенного преимущества.

Дополнительную информацию вы можете найти здесь

person Vlad    schedule 14.01.2020

Год спустя я узнал несколько полезных передовых практик:

  • Используйте Google AI Platform, выберите для создания виртуальной машины с необходимым количеством процессоров.
  • Используйте Dask для многопоточности.
  • С Pandas есть возможность распараллелить .apply() с pandarallel
person MichaelU    schedule 30.06.2020