我正在使用带有一些大中间值的Dask,并且我从pickle中得到错误,如下所示:
error: 'i' format requires -2147483648 <= number <= 2147483647
发生了什么事? Dask不支持序列化大于2GB的数据块吗?
答案 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 2即将结束。现在可能是考虑开始使用Python 3的一个方便的时间,因为许多问题都会消失。大多数社区库现在支持Python 3,或者比支持Python 2更好。
当然,切换可能是一个挑战,特别是对于大型企业代码库,所以上面的其他选项可能在短期内就足够了。