Использование Dask map_partition с Series StringMethods дает мне ошибку памяти - PullRequest
0 голосов
/ 04 марта 2020

Мой файл chickens.csv содержит около 140 столбцов и 1,5 миллиона записей.
Это примерно 1,1 гигабайта на диске.
Когда я запускаю следующий код:

def main():
    frame = dd.read_csv("Z:\\food\\chickens.csv", sep=",", encoding="utf-8", engine='python', dtype="object")
    print(frame)

    for field in frame.columns:
         frame[field] = frame[field].map_partitions(lambda value:value.str.slice(start=1,stop=-1))

    frame = frame.set_index("ID_NUM", drop=False, npartitions='auto')
    print(frame)

main()

Я получаю эту ошибку памяти

  File "F:/Desktop/food-processing/tester.py", line 27, in <module>
    main()
  File "F:/Desktop/food-processing/tester.py", line 20, in main
    frame = frame.set_index("ID_NUM", drop=False, npartitions='auto')
  File "F:\Desktop\food-processing\chicken_farm\venv\lib\site-packages\dask\dataframe\core.py", line 3557, in set_index
    **kwargs
  File "F:\Desktop\food-processing\chicken_farm\venv\lib\site-packages\dask\dataframe\shuffle.py", line 79, in set_index
    divisions, sizes, mins, maxes, optimize_graph=False
  ...
  ...
  File "F:\Desktop\food-processing\chicken_farm\venv\lib\site-packages\pandas\core\internals\blocks.py", line 771, in copy
    values = values.copy()
MemoryError: Unable to allocate 40.7 MiB for an array with shape (143, 37273) and data type object

Что я делаю не так?

1 Ответ

1 голос
/ 04 марта 2020

Вместо того, чтобы звонить map_partitions столько раз, вы можете позвонить ему всего один раз и выполнить l oop в ваших задачах

заменить

for field in frame.columns:
     frame[field] = frame[field].map_partitions(lambda value:value.str.slice(start=1,stop=-1))

на

def slicethem(frame):
    for field in frame.columns:
        frame[field] = frame[field].str.slice(start=1, stop=-1)
    return frame
frame = frame.map_partitions(slicethem)

В итоге получается гораздо меньший график и меньше посредников.

...