Python: ошибка возникает в Spyder при изменении панд DataFrame с многопоточностью - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть большой фрейм данных и столбец «изображение», данные в «изображении» - это имя файла (с расширением, равным «jpg» или «jpeg») большого количества файлов.Некоторые файлы существуют с правильным расширением, а другие нет.Итак, я должен проверить правильность данных «image», но это занимает 30 секунд с однопоточностью, затем я решаю сделать это с многопоточностью.

Я написал код на Python (3.6.5) чтобы проверить это, он работает хорошо, когда я выполняю его в командной строке, но возникает ошибка, когда я выполняю его в Spyder (3.2.8), как я могу избежать этого?

Вот мойкод:

# -*- coding: utf-8 -*-
import multiprocessing
import numpy as np
import os
import pandas as pd
from multiprocessing import Pool

#some large scale DataFrame, the size is about (600, 15)
waferDf = pd.DataFrame({"image": ["aaa.jpg", "bbb.jpeg", "ccc.jpg", "ddd.jpeg", "eee.jpg", "fff.jpg", "ggg.jpeg", "hhh.jpg"]})
waferDf["imagePath"] = np.nan

#to parallelize whole process
def parallelize(func, df, uploadedDirPath):
    partitionCount = multiprocessing.cpu_count()
    partitions = np.array_split(df, partitionCount)
    paras = [(part, uploadedDirPath) for part in partitions]
    pool = Pool(partitionCount)
    df = pd.concat(pool.starmap(func, paras))
    pool.close()
    pool.join()
    return df

#check whether files exist
def checkImagePath(partialDf, uploadedDirPath):
    for index in partialDf.index.values:
        print(index)
        if os.path.exists(os.path.join(uploadedDirPath, partialDf.loc[index, ["image"]][0].replace(".jpeg\n", ".jpeg"))):
            partialDf.loc[index, ["imagePath"]][0] = os.path.join(uploadedDirPath, partialDf.loc[index, ["image"]][0].replace(".jpeg\n", ".jpeg"))
        elif os.path.exists(os.path.join(uploadedDirPath, partialDf.loc[index, ["image"]][0].replace(".jpeg\n", ".jpg"))):
            partialDf.loc[index, ["imagePath"]][0] = os.path.join(uploadedDirPath, partialDf.loc[index, ["image"]][0].replace(".jpeg\n", ".jpg"))
        print(partialDf)
    return partialDf

if __name__ == '__main__':
    waferDf = parallelize(checkImagePath, waferDf, "/eap/uploadedFiles/")
    print(waferDf)

и вот ошибка:

runfile('C:/Users/00048564/Desktop/Multi-Threading.py', wdir='C:/Users/00048564/Desktop')
Traceback (most recent call last):

  File "<ipython-input-24-732edc0ea3ea>", line 1, in <module>
    runfile('C:/Users/00048564/Desktop/Multi-Threading.py', wdir='C:/Users/00048564/Desktop')

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/00048564/Desktop/Multi-Threading.py", line 35, in <module>
    waferDf = parallelize(checkImagePath, waferDf, "/eap/uploadedFiles/")

  File "C:/Users/00048564/Desktop/Multi-Threading.py", line 17, in parallelize
    pool = Pool(partitionCount)

  File "C:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 119, in Pool
    context=self.get_context())

  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 174, in __init__
    self._repopulate_pool()

  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 239, in _repopulate_pool
    w.start()

  File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)

  File "C:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)

  File "C:\ProgramData\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)

  File "C:\ProgramData\Anaconda3\lib\multiprocessing\spawn.py", line 172, in get_preparation_data
    main_mod_name = getattr(main_module.__spec__, "name", None)

AttributeError: module '__main__' has no attribute '__spec__'

1 Ответ

0 голосов
/ 14 сентября 2018

В большинстве случаев, когда вы запускаете скрипт python из командной строки, вызывая ключевое слово python 'YourFile.py', скрипт выполняется как основная программа. Поэтому он смог вызвать необходимые модули, такие как многопроцессорные и другие модули, показанные в вашей ошибкеtrace.

Однако ваши конфигурации Spyder могут отличаться, и ваша инструкция по запуску сценария, так как основная программа не работает.

Удалось ли вам успешно запустить любой сценарий из Spyder с * 1005?*

if __name__ == '__main__':

Прочитать принятый ответ в этой теме https://stackoverflow.com/a/419185/9968677

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...