Как сократить время, затрачиваемое на преобразование кадра данных dask в кадр данных pandas - PullRequest
1 голос
/ 19 сентября 2019

У меня есть функция для чтения больших csv-файлов с использованием dask dataframe, а затем преобразования в pandas dataframe, что занимает довольно много времени.Код:

def t_createdd(Path):
  dataframe = dd.read_csv(Path, sep = chr(1), encoding = "utf-16")
  return dataframe

#Get the latest file
Array_EXT = "Export_GTT_Tea2Array_*.csv"
array_csv_files = sorted([file
             for path, subdir, files in os.walk(PATH)
             for file in glob(os.path.join(path, Array_EXT))])

latest_Tea2Array=array_csv_files[(len(array_csv_files)-(58+25)): 
(len(array_csv_files)-58)]


 Tea2Array_latest = t_createdd(latest_Tea2Array)

 #keep only the required columns
 Tea2Array = Tea2Array_latest[['Parameter_Id','Reading_Id','X','Value']]

 P1MI3 = Tea2Array.loc[Tea2Array['parameter_id']==168566]
 P1MI3=P1MI3.compute()

 P1MJC_main = Tea2Array.loc[Tea2Array['parameter_id']==168577]
 P1MJC_old=P1MJC_main.compute()

P1MI3=P1MI3.compute() и P1MJC_old=P1MJC_main.compute() занимает около 10 и 11 минут соответственно для выполнения.Есть ли способ сократить время.

1 Ответ

1 голос
/ 19 сентября 2019

Я бы посоветовал вам подумать, со ссылкой на документацию Dask, почему вы ожидаете, что процесс будет быстрее, чем при использовании только панд.Обратите внимание:

  • доступ к файлу может быть из нескольких потоков, но у вас есть только одно узкое место в интерфейсе диска, и, вероятно, он выполняет намного лучшее последовательное чтение, чем попытка чтения нескольких файлов параллельно
  • чтениеCSVs сильно загружены процессором и нуждаются в GIL для Python.Несколько потоков на самом деле не будут работать параллельно
  • , когда вы вычисляете, вы материализуете весь фрейм данных.Это правда, что вы, кажется, выбираете одну строку в каждом случае, но Dask не может узнать, в каком именно файле / части он находится.
  • вы вызываете compute дважды, но могли бы объединить их: Dask работаетТрудно извлечь данные из памяти, которая в настоящее время не требуется для каких-либо вычислений, поэтому вы удваиваете работу.Вызвав compute для обоих выходов, вы сократите время вдвое.

Дополнительные замечания:

  • очевидно, вы бы справились намного лучше, если бы знали, какой раздел содержит
  • вы можете обойти GIL, используя процессы, например, распределенный планировщик Dask
  • если вам нужны только определенные столбцы, не беспокойтесь о загрузке всего и последующем выборе, включите эти столбцы прямо в функцию read_csv, сохранивмного времени и памяти (верно для панд или даск).

Чтобы вычислить обе ленивые вещи одновременно:

dask.compute(P1MI3, P1MJC_main)
...