我正在尝试申请_pickle将数据保存到磁盘上.但是在打电话时_pickle.dump,我收到了一个错误
OverflowError: cannot serialize a bytes object larger than 4 GiB
Run Code Online (Sandbox Code Playgroud)
这是一个难以使用的限制_pickle吗?(cPickle对于python2)
我愿意使用多处理模块进行特征工程(multiprocessing.Pool.starmap().但是,它给出了如下错误消息.我想这错误信息是关于输入的大小(2147483647 = 2 ^ 31 - 1),由于在相同的代码工作顺利为一小部分(frac=0.05)输入dataframes(train_scala,测试,TS)的.我将数据帧的类型转换为尽可能小,但它并没有变得更好.
anaconda版本是4.3.30,Python版本是3.6(64位).并且系统的内存大小超过128GB,超过20个内核.您是否建议使用任何指针或解决方案来解决此问题?如果这个问题是由多处理模块的大数据引起的,那么我应该使用多少小数据来利用Python3上的多处理模块?
码:
from multiprocessing import Pool, cpu_count
from itertools import repeat
p = Pool(8)
is_train_seq = [True]*len(historyCutoffs)+[False]
config_zip = zip(historyCutoffs, repeat(train_scala), repeat(test), repeat(ts), ul_parts_path, repeat(members), is_train_seq)
p.starmap(multiprocess_FE, config_zip)
Run Code Online (Sandbox Code Playgroud)
错误信息:
Traceback (most recent call last):
File "main_1210_FE_scala_multiprocessing.py", line 705, in <module>
print('----Pool starmap start----')
File "/home/dmlab/ksedm1/anaconda3/envs/py36/lib/python3.6/multiprocessing/pool.py", line 274, in starmap
return self._map_async(func, iterable, starmapstar, chunksize).get()
File "/home/dmlab/ksedm1/anaconda3/envs/py36/lib/python3.6/multiprocessing/pool.py", line 644, in get
raise self._value
File "/home/dmlab/ksedm1/anaconda3/envs/py36/lib/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks …Run Code Online (Sandbox Code Playgroud) 如何更改 Pythonmultiprocessing库使用的序列化方法?特别是,默认序列化方法使用pickle具有该版本 Python 的默认 pickle 协议版本的库。默认的 pickle 协议在 Python 2.7 中是版本 2,在 Python 3.6 中是版本 3。如何在 Python 3.6 中将协议版本设置为 2,以便我可以使用库中的一些类(如Client和Listener)在multiprocessingPython 2.7 运行的服务器处理和 Python 3.6 运行的客户端进程之间进行通信?
(旁注:作为测试,我修改了第 206 行multiprocessing/connection.py,添加protocol=2到dump()调用中以强制协议版本为 2,并且我的客户端/服务器进程在我有限的测试中工作,服务器由 2.7 运行,客户端由 3.6 运行)。
在 Python 3.6 中,合并了一个补丁来设置序列化程序,但是该补丁没有记录,我还没有弄清楚如何使用它。这是我尝试使用它的方式(我也将其发布到我链接到的 Python 票证上):
pickle2reducer.py:
from multiprocessing.reduction import ForkingPickler, AbstractReducer
class ForkingPickler2(ForkingPickler):
def __init__(self, *args):
if len(args) > 1:
args[1] = 2
else:
args.append(2)
super().__init__(*args)
@classmethod …Run Code Online (Sandbox Code Playgroud)