【问题标题】:Pickling issue with python pathospython pathos的酸洗问题
【发布时间】:2015-12-27 15:44:18
【问题描述】:
import pathos.multiprocessing as mp
class Model_Output_File():
    """
    Class to read Model Output files
    """
    def __init__(self, ftype = ''):
        """
        Constructor
        """
        # Create a sqlite database in the analysis directory
        self.db_name = 'sqlite:///' + constants.anly_dir + os.sep + ftype + '_' + '.db'
        self.engine  = create_engine(self.db_name)
        self.ftype   = ftype

    def parse_DGN(self, fl):
        df      = pandas.read_csv(...)
        df.to_sql(self.db_name, self.engine, if_exists='append')

    def collect_epic_output(self, fls):
        pool = mp.ProcessingPool(4)
        if(self.ftype == 'DGN'):
            pool.map(self.parse_DGN, fls)
        else:
            logging.info( 'Wrong file type')

if __name__ == '__main__':
    list_fls = fnmatch.filter(...)
    obj = Model_Output_File(ftype = 'DGN')
    obj.collect_model_output(list_fls)

在上面的代码中,我使用 pathos 多处理库来避免类的 python 多处理问题。但是我得到一个酸洗错误:

  pool.map(self.parse_DGN, fls)
  File "C:\Anaconda64\lib\site-packages\pathos-0.2a1.dev0-py2.7.egg\pathos\multiprocessing.py", line 131, in map
    return _pool.map(star(f), zip(*args)) # chunksize
  File "C:\Anaconda64\lib\multiprocessing\pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "C:\Anaconda64\lib\multiprocessing\pool.py", line 567, in get
    raise self._value
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

我该如何解决这个问题?

【问题讨论】:

  • 我是pathos 作者。你得到了一个cPickle.PicklingError…你不应该得到pathos。您是否安装了multiprocess,如果安装了,您是否有 C 编译器?您可以通过导入dill 并在对象上执行dill.copy 来检查酸洗错误。如果这样可行,那么您可能遇到了一些安装问题,pathos 正在查找 multiprocessing 的标准库版本,而不是提供更好序列化的 fork。
  • 你会dill.copy(self.parse_DGN)。因此,如果您正在寻找 python 标准库multiprocessing,那么您可能需要安装一个编译器……比如 Microsoft Visual Studio Community。见:github.com/mmckerns/tuthpc
  • 您在安装 MS 编译器后是否重新构建了multiprocess
  • 好吧,这看起来很奇怪。 multiprocess 应该只是 pip install 没有问题。也许您可以在multiprocess github 页面上将此作为票证发布?这样,我可以更好地诊断您的回溯?我唯一能想到的没有看到回溯/构建输出的另一件事是你有一个不寻常的 PYTHONPATH。
  • 酷。享受!如果您发现还有其他问题,请随时提交工单。

标签: python python-multiprocessing pathos


【解决方案1】:

我遇到了同样的问题。神秘的是相同的代码在一台win7机器上工作,而不是另一台win7! 然后我检查了版本 --- 原来 dill 和 multiprocess 在 balky 机器上是 1 个更高的版本。我将 dill 和 multiprocess 分别降低到 0.2.5 和 0.70.4。这解决了问题! 希望有帮助

【讨论】:

  • 这似乎有点奇怪。当您降低版本时,您是否也有旧版本的python?因为multiprocess 通常与python 的最新版本保持同步,因为我基本上会在每个新版本中分叉multiprocessing。如果python 的次要版本之间存在一些不兼容,我很想知道。
【解决方案2】:

我是pathos 作者。你得到了一个cPickle.PicklingError...你不应该得到pathos。确保你已经安装了multiprocess,如果你安装了,那么你有一个 C++ 编译器。您可以通过导入dill 并在您的类中执行dill.copy(self.parse_DGN) 或在外部使用该类的实例来检查酸洗错误。如果可行,那么您可能遇到了一些安装问题,pathos 正在查找 python 标准库multiprocessing。如果是这样,那么您可能需要安装一个编译器……比如 Microsoft Visual Studio Community。请参阅:github.com/mmckerns/tuthpc。确保在安装 MS 编译器后重建 multiprocess

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多