python 悲伤的酸洗问题
Pickling issue with python pathos
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
并在 class 中执行 dill.copy(self.parse_DGN)
或在外部使用 class 的实例来检查 pickling 错误。如果可行,那么您可能遇到了一些安装问题,其中 pathos
正在寻找 python 标准库 multiprocessing
。如果是这样,那么您可能需要安装一个编译器……例如 Microsoft Visual Studio Community。参见:github.com/mmckerns/tuthpc。确保在安装 MS 编译器后重建 multiprocess
。
我遇到了同样的问题。神秘的是相同的相同代码在一台 win7 机器上工作而不是另一台 win7!
然后我检查了版本——原来 dill 和 multiprocess 在 balky 机器上的版本高了 1。我 down-versioned dill 和 multiprocess 分别为 0.2.5 和 0.70.4。这解决了问题!
希望有帮助
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
并在 class 中执行 dill.copy(self.parse_DGN)
或在外部使用 class 的实例来检查 pickling 错误。如果可行,那么您可能遇到了一些安装问题,其中 pathos
正在寻找 python 标准库 multiprocessing
。如果是这样,那么您可能需要安装一个编译器……例如 Microsoft Visual Studio Community。参见:github.com/mmckerns/tuthpc。确保在安装 MS 编译器后重建 multiprocess
。
我遇到了同样的问题。神秘的是相同的相同代码在一台 win7 机器上工作而不是另一台 win7! 然后我检查了版本——原来 dill 和 multiprocess 在 balky 机器上的版本高了 1。我 down-versioned dill 和 multiprocess 分别为 0.2.5 和 0.70.4。这解决了问题! 希望有帮助