如何告诉python多重处理序列化应使用哪种pickle协议?
问题是我想使用multiprocessing.Pool.apply_async
在并行过程中处理大熊猫DataFrame,结果出现以下错误:
OverflowError:无法序列化大于4 GiB的字节对象
根据此链接https://github.com/stan-dev/pystan/issues/197,此问题可能是由于使用默认版本的pickle协议(pickle.DEFAULT_PROTOCOL = 3)进行的多重处理,而protocol = pickle.HIGHEST_PROTOCOL = 4可以避免该问题
谢谢您的帮助!
更新:
以下候选解决方案(基于the link referenced by @juanpa.arrivillaga)
from multiprocessing.reduction import ForkingPickler
class ForkingPicklerHighest(ForkingPickler):
@classmethod
def dumps(cls, obj, protocol=None):
return ForkingPickler.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL)
multiprocessing.connection._ForkingPickler = ForkingPicklerHighest
产生以下错误:
struct.error:“ i”格式要求-2147483648 <=数字<= 2147483647
,因此需要更好的解决方案!