相关疑难解决方法(0)

python3中的_pickle不适用于大数据保存

我正在尝试申请_pickle将数据保存到磁盘上.但是在打电话时_pickle.dump,我收到了一个错误

OverflowError: cannot serialize a bytes object larger than 4 GiB
Run Code Online (Sandbox Code Playgroud)

这是一个难以使用的限制_pickle吗?(cPickle对于python2)

python pickle

33
推荐指数
2
解决办法
2万
查看次数

python struct.error:'i'格式需要-2147483648 <= number <= 2147483647

问题

我愿意使用多处理模块进行特征工程(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)

python struct multiprocessing python-3.x starmap

14
推荐指数
2
解决办法
6656
查看次数

如何更改多处理模块使用的序列化方法?

如何更改 Pythonmultiprocessing库使用的序列化方法?特别是,默认序列化方法使用pickle具有该版本 Python 的默认 pickle 协议版本的库。默认的 pickle 协议在 Python 2.7 中是版本 2,在 Python 3.6 中是版本 3。如何在 Python 3.6 中将协议版本设置为 2,以便我可以使用库中的一些类(如ClientListener)在multiprocessingPython 2.7 运行的服务器处理和 Python 3.6 运行的客户端进程之间进行通信?

(旁注:作为测试,我修改了第 206 行multiprocessing/connection.py,添加protocol=2dump()调用中以强制协议版本为 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)

python serialization pickle python-multiprocessing

6
推荐指数
1
解决办法
4033
查看次数