在Dask中序列化大于2GB的数据时出错

时间:2017-08-24 14:22:02

标签: python pickle dask dask-distributed

我正在使用带有一些大中间值的Dask,并且我从pickle中得到错误,如下所示:

error: 'i' format requires -2147483648 <= number <= 2147483647

发生了什么事? Dask不支持序列化大于2GB的数据块吗?

1 个答案:

答案 0 :(得分:3)

Dask有时会使用Pickle和Cloudpickle库来序列化数据。在Python 2中,Pickle有2GB的限制。这个问题有几个解决方案:

使用较小的块

您可能希望减少chunksize以传递每个小于2GB的数据位。这也可以帮助您提高性能。对于今天的大多数应用来说,2GB的块是相当大的。我个人倾向于拍摄接近100MB的块大小。

在dask.dataframe中,您通常可以在读取数据时控制块大小,例如blocksize=中的dd.read_csv关键字(尽管不同的数据提取方法会有不同的方法) 。

或者,您可以重新分配数据。

df = df.repartition(npartitions=1000)

定义自定义序列化程序

Dask不必使用Pickle,事实上它通常不适用于像NumPy数组这样的特殊数据类型。有关如何注册自己的序列化函数,请参阅以下文档:

http://distributed.readthedocs.io/en/latest/serialization.html

使用Python 3

Python 2即将结束。现在可能是考虑开始使用Python 3的一个方便的时间,因为许多问题都会消失。大多数社区库现在支持Python 3,或者比支持Python 2更好。

当然,切换可能是一个挑战,特别是对于大型企业代码库,所以上面的其他选项可能在短期内就足够了。