Проблема с использованием пользовательской функции с многопроцессорностью в Python 3.7 - PullRequest
0 голосов
/ 05 апреля 2020

Я создал пользовательскую функцию для очистки большого текста с помощью регулярных выражений в Python 3.7. Я использую jupyter notebook 6.0.3

import numpy as np
import pandas as pd
import re
import string

def pre_process(arr):
    legal_chars = string.ascii_letters + string.punctuation + string.digits + string.whitespace + "äÄöÖüÜ"
    while "  " in arr: # removes unnecessary empty spaces
        arr = arr.replace("  ", " ")

    while "\n\n" in arr: # removes unnecessary new lines
        arr = arr.replace("\n\n", "\n") 

    for char in arr: # removes illegal charachters
        if char not in legal_chars:
            arr=arr.replace(char,"")    

    pattern4 = r"[\d]+\W[\d]+" # remove long numbers separated with non-digit
    pattern4_1 = r"[\d]+\W[\d]+"
    arr = re.sub(pattern4, '1', arr)
    arr = re.sub(pattern4_1, '', arr)

    pattern5 = r"\W[\d]+\W[\d]+\W" # remove long numbers enclosed by non-digit
    pattern6 = r"\W[\d]+\W"
    arr = re.sub(pattern5, '.', arr)
    arr = re.sub(pattern6, '', arr)

    pattern1 = r"\d{5,}" # remove long numbers
    arr = re.sub(pattern1, '', arr)
    return arr

При запуске в соответствующем столбце в моем меньшем тестовом фрейме непосредственно с .apply - он возвращает ожидаемые результаты и текст очищается.

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

Я использовал:

import multiprocessing as mp
with mp.Pool() as pool:
    df_t["Text"] = pool.map(pre_process,df_t["Text"])

Я успешно использовал многопроцессорность на одном и том же фрейме данных со встроенными функциями, но при запуске с моей пользовательской функцией ничего не происходит. Ядро просто зависает. Я попытался с pool.apply (), а также без результатов.

Может ли это быть проблемой в моей функции или я неправильно использую многопроцессорную обработку?

Я попытался применить предложения здесь: multiprocessing.Pool: Когда использовать apply, apply_asyn c или map? , но без изменений.

1 Ответ

0 голосов
/ 05 апреля 2020

Я не вижу никаких проблем с вашим кодом. Фактически я смог запустить его на своей локальной машине без проблем на фиктивном pandas DataFrame. У меня есть некоторые мысли о потенциальной причине проблемы. У меня были проблемы с пакетом multiprocessing, использующим python 3.7 на PyCharm 2019 раньше. Я решил проблему путем понижения до PyCharm 2018 и python 3.6. Я запустил ваш код с этой конфигурацией на фиктивном DataFrame без проблем.

Вы можете проверить эту ссылку относительно проблемы (если, конечно, мое предположение верно)

...